diff options
author | Thomas Adam <thomas@xteddy.org> | 2017-04-20 12:01:14 +0100 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2017-04-20 12:01:14 +0100 |
commit | 48371216df07c588180b8e2246930a96e94de62b (patch) | |
tree | b7fe5d01adee8885d766616fcea5ff41d773ec01 /job.c | |
parent | e30f9dc1fae848d659295a9dfab0a5e0cf4e1a46 (diff) | |
parent | 21993105e53da0f5aae583b494c83f1cbbf48b1b (diff) |
Merge branch 'obsd-master'
Diffstat (limited to 'job.c')
-rw-r--r-- | job.c | 49 |
1 files changed, 33 insertions, 16 deletions
@@ -32,8 +32,9 @@ * output. */ -static void job_callback(struct bufferevent *, short, void *); +static void job_read_callback(struct bufferevent *, void *); static void job_write_callback(struct bufferevent *, void *); +static void job_error_callback(struct bufferevent *, short, void *); /* All jobs list. */ struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs); @@ -41,7 +42,8 @@ struct joblist all_jobs = LIST_HEAD_INITIALIZER(all_jobs); /* Start a job running, if it isn't already. */ struct job * job_run(const char *cmd, struct session *s, const char *cwd, - void (*callbackfn)(struct job *), void (*freefn)(void *), void *data) + job_update_cb updatecb, job_complete_cb completecb, job_free_cb freecb, + void *data) { struct job *job; struct environ *env; @@ -103,17 +105,18 @@ job_run(const char *cmd, struct session *s, const char *cwd, job->pid = pid; job->status = 0; - LIST_INSERT_HEAD(&all_jobs, job, lentry); + LIST_INSERT_HEAD(&all_jobs, job, entry); - job->callbackfn = callbackfn; - job->freefn = freefn; + job->updatecb = updatecb; + job->completecb = completecb; + job->freecb = freecb; job->data = data; job->fd = out[0]; setblocking(job->fd, 0); - job->event = bufferevent_new(job->fd, NULL, job_write_callback, - job_callback, job); + job->event = bufferevent_new(job->fd, job_read_callback, + job_write_callback, job_error_callback, job); bufferevent_enable(job->event, EV_READ|EV_WRITE); log_debug("run job %p: %s, pid %ld", job, job->cmd, (long) job->pid); @@ -126,11 +129,11 @@ job_free(struct job *job) { log_debug("free job %p: %s", job, job->cmd); - LIST_REMOVE(job, lentry); + LIST_REMOVE(job, entry); free(job->cmd); - if (job->freefn != NULL && job->data != NULL) - job->freefn(job->data); + if (job->freecb != NULL && job->data != NULL) + job->freecb(job->data); if (job->pid != -1) kill(job->pid, SIGTERM); @@ -142,7 +145,21 @@ job_free(struct job *job) free(job); } -/* Called when output buffer falls below low watermark (default is 0). */ +/* Job buffer read callback. */ +static void +job_read_callback(__unused struct bufferevent *bufev, void *data) +{ + struct job *job = data; + + if (job->updatecb != NULL) + job->updatecb (job); +} + +/* + * Job buffer write callback. Fired when the buffer falls below watermark + * (default is empty). If all the data has been written, disable the write + * event. + */ static void job_write_callback(__unused struct bufferevent *bufev, void *data) { @@ -160,7 +177,7 @@ job_write_callback(__unused struct bufferevent *bufev, void *data) /* Job buffer error callback. */ static void -job_callback(__unused struct bufferevent *bufev, __unused short events, +job_error_callback(__unused struct bufferevent *bufev, __unused short events, void *data) { struct job *job = data; @@ -168,8 +185,8 @@ job_callback(__unused struct bufferevent *bufev, __unused short events, log_debug("job error %p: %s, pid %ld", job, job->cmd, (long) job->pid); if (job->state == JOB_DEAD) { - if (job->callbackfn != NULL) - job->callbackfn(job); + if (job->completecb != NULL) + job->completecb(job); job_free(job); } else { bufferevent_disable(job->event, EV_READ); @@ -186,8 +203,8 @@ job_died(struct job *job, int status) job->status = status; if (job->state == JOB_CLOSED) { - if (job->callbackfn != NULL) - job->callbackfn(job); + if (job->completecb != NULL) + job->completecb(job); job_free(job); } else { job->pid = -1; |