From 021cdbe1c0111951a1f63b09b41c9e3db3793db5 Mon Sep 17 00:00:00 2001 From: nicm Date: Wed, 17 Jun 2015 16:44:49 +0000 Subject: [PATCH] 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. --- job.c | 13 ++++++++----- tmux.h | 6 ++++++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/job.c b/job.c index 5675eec3..0b348eda 100644 --- a/job.c +++ b/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; + } } diff --git a/tmux.h b/tmux.h index da91d4db..ff0b4c84 100644 --- a/tmux.h +++ b/tmux.h @@ -714,6 +714,12 @@ struct options { /* Scheduled job. */ struct job { + enum { + JOB_RUNNING, + JOB_DEAD, + JOB_CLOSED + } state; + char *cmd; pid_t pid; int status;