mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +00:00 
			
		
		
		
	Merge branch 'obsd-master'
This commit is contained in:
		
							
								
								
									
										49
									
								
								job.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								job.c
									
									
									
									
									
								
							@@ -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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user