aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/wait.c
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2021-10-19 13:28:01 -0700
committerNicholas Noll <nbnoll@eml.cc>2021-10-19 13:28:01 -0700
commit2b53bca326decd50012883f0cff3b5316a3e100d (patch)
tree570220ba22df388958e296f09add682720de6b51 /sys/cmd/rc/wait.c
parentaf3fa90e8bb41c306c5fe2d2cf105db6bbabd1d9 (diff)
feat(rc): prototype of async jobs
Diffstat (limited to 'sys/cmd/rc/wait.c')
-rw-r--r--sys/cmd/rc/wait.c55
1 files changed, 17 insertions, 38 deletions
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; i<job->wait.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);
}