mirror of
https://github.com/tmate-io/tmate.git
synced 2024-11-08 01:04:06 +01:00
Use an explicit job state instead of avoid closing our side of the
socketpair and setting it to -1 to mark when the other side is closed. This avoids closing it while the libevent bufferevent still has it (it could try to add it to the polled set which some mechanisms don't like). Fixes part a problem reported by Bruno Sutic.
This commit is contained in:
parent
d96ab34019
commit
021cdbe1c0
13
job.c
13
job.c
@ -100,6 +100,8 @@ job_run(const char *cmd, struct session *s, int cwd,
|
||||
close(out[1]);
|
||||
|
||||
job = xmalloc(sizeof *job);
|
||||
job->state = JOB_RUNNING;
|
||||
|
||||
job->cmd = xstrdup(cmd);
|
||||
job->pid = pid;
|
||||
job->status = 0;
|
||||
@ -167,14 +169,13 @@ job_callback(unused struct bufferevent *bufev, unused short events, void *data)
|
||||
|
||||
log_debug("job error %p: %s, pid %ld", job, job->cmd, (long) job->pid);
|
||||
|
||||
if (job->pid == -1) {
|
||||
if (job->state == JOB_DEAD) {
|
||||
if (job->callbackfn != NULL)
|
||||
job->callbackfn(job);
|
||||
job_free(job);
|
||||
} else {
|
||||
bufferevent_disable(job->event, EV_READ);
|
||||
close(job->fd);
|
||||
job->fd = -1;
|
||||
job->state = JOB_CLOSED;
|
||||
}
|
||||
}
|
||||
|
||||
@ -186,10 +187,12 @@ job_died(struct job *job, int status)
|
||||
|
||||
job->status = status;
|
||||
|
||||
if (job->fd == -1) {
|
||||
if (job->state == JOB_CLOSED) {
|
||||
if (job->callbackfn != NULL)
|
||||
job->callbackfn(job);
|
||||
job_free(job);
|
||||
} else
|
||||
} else {
|
||||
job->pid = -1;
|
||||
job->state = JOB_DEAD;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user