From 2b53bca326decd50012883f0cff3b5316a3e100d Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 19 Oct 2021 13:28:01 -0700 Subject: feat(rc): prototype of async jobs --- sys/cmd/rc/wait.c | 55 +++++++++++++++++-------------------------------------- 1 file changed, 17 insertions(+), 38 deletions(-) (limited to 'sys/cmd/rc/wait.c') diff --git a/sys/cmd/rc/wait.c b/sys/cmd/rc/wait.c index 44ffb58..e3dcea1 100644 --- a/sys/cmd/rc/wait.c +++ b/sys/cmd/rc/wait.c @@ -41,7 +41,7 @@ await(int pid4, int opt, struct WaitMsg *msg) msg->time[1] = s; msg->time[2] = u+s; msg->status = WEXITSTATUS(status); - msg->type = PDone; + msg->type = Pdone; return 1; } @@ -52,7 +52,7 @@ await(int pid4, int opt, struct WaitMsg *msg) msg->time[1] = s; msg->time[2] = u+s; msg->status = WCOREDUMP(status); - msg->type = PSig; + msg->type = Psig; return 1; } @@ -63,7 +63,7 @@ await(int pid4, int opt, struct WaitMsg *msg) msg->time[1] = s; msg->time[2] = u+s; msg->status = WSTOPSIG(status); - msg->type = PStop; + msg->type = Pstop; return 1; } @@ -77,7 +77,7 @@ shouldwait(Thread *job) int i; for(i=0; iwait.len; i++){ - if(job->wait.on[i].status == PRun) + if(job->wait.on[i].status == Prun) return 1; } @@ -112,7 +112,7 @@ addwait(Thread *job, int pid) job->wait.on = erealloc(job->wait.on, job->wait.cap*sizeof(*job->wait.on)); } - job->wait.on[job->wait.len++] = (struct WaitItem){.pid=pid, .status=PRun}; + job->wait.on[job->wait.len++] = (struct WaitItem){.pid=pid, .status=Prun}; } void @@ -142,21 +142,22 @@ waitall(Thread *job) for(i=0; i < job->wait.len; i++){ if(job->wait.on[i].pid == msg.pid){ + job->status = msg.status; switch(msg.type){ - case PStop: + case Pstop: print(shell.err, "%d: suspended\n", msg.pid); - job->wait.status = PStop; - job->wait.on[i].status = PStop; + job->wait.status = Pstop; + job->wait.on[i].status = Pstop; break; - case PSig: + case Psig: print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status); /* fallthrough */ - case PDone: - job->wait.on[i].status = PDone; + case Pdone: + job->wait.on[i].status = Pdone; delwait(job, msg.pid); if(!job->wait.len) - job->wait.status = PDone; + job->wait.status = Pdone; break; default: @@ -166,28 +167,6 @@ waitall(Thread *job) } } } -#if 0 - for(t=job; t; t=t->link){ - if(t->pid == msg.pid){ - t->status = msg.status; - if(msg.suspend){ - t->flag.stop = 1; - }else{ - t->flag.done = 1; - if(msg.signal){ - print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status); - } - } - delwait(t, msg.pid); - goto outer; - } - } - perror("waitpid"); - return 0; - outer:; - } -#endif - return 1; } @@ -206,13 +185,13 @@ killzombies(void) perror("invalid pid"); if(WIFEXITED(status)) - job->wait.status = PDone; + job->wait.status = Pdone; if(WIFSTOPPED(status)) - job->wait.status = PStop; + job->wait.status = Pstop; if(WIFCONTINUED(status)) - job->wait.status = PAgain; + job->wait.status = Pagain; - if(job->wait.status == PDone){ + if(job->wait.status == Pdone){ report(job,index); deljob(job); } -- cgit v1.2.1