summaryrefslogtreecommitdiffstats
path: root/job.c
diff options
context:
space:
mode:
authornicm <nicm>2015-06-17 16:44:49 +0000
committernicm <nicm>2015-06-17 16:44:49 +0000
commit021cdbe1c0111951a1f63b09b41c9e3db3793db5 (patch)
tree2716f2d6a0a572603511d239420a34919904b54f /job.c
parentd96ab3401960ab4a7c9434dfda1ebdc5204873e0 (diff)
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.
Diffstat (limited to 'job.c')
-rw-r--r--job.c13
1 files changed, 8 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;
+ }
}