Use an explicit job state instead of avoid closing our side of the
authornicm <nicm@openbsd.org>
Wed, 17 Jun 2015 16:44:49 +0000 (16:44 +0000)
committernicm <nicm@openbsd.org>
Wed, 17 Jun 2015 16:44:49 +0000 (16:44 +0000)
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.

usr.bin/tmux/job.c
usr.bin/tmux/tmux.h

index 7995b6d..a461f5c 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: job.c,v 1.35 2015/04/24 22:19:36 nicm Exp $ */
+/* $OpenBSD: job.c,v 1.36 2015/06/17 16:44:49 nicm Exp $ */
 
 /*
  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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;
+       }
 }
index ce057af..36a9648 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.524 2015/06/15 10:58:01 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.525 2015/06/17 16:44:49 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -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;