aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/wait.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cmd/rc/wait.c')
-rw-r--r--sys/cmd/rc/wait.c107
1 files changed, 55 insertions, 52 deletions
diff --git a/sys/cmd/rc/wait.c b/sys/cmd/rc/wait.c
index e3dcea1..6a8d859 100644
--- a/sys/cmd/rc/wait.c
+++ b/sys/cmd/rc/wait.c
@@ -84,6 +84,39 @@ shouldwait(Thread *job)
return 0;
}
+static inline
+void
+notify(Thread *job, struct WaitMsg msg)
+{
+ int i;
+ 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:
+ print(shell.err, "%d: suspended\n", msg.pid);
+ job->wait.status = Pstop;
+ job->wait.on[i].status = Pstop;
+ break;
+
+ case Psig:
+ print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status);
+ /* fallthrough */
+ case Pdone:
+ job->wait.on[i].status = Pdone;
+ delwait(job, msg.pid);
+ if(!job->wait.len)
+ job->wait.status = Pdone;
+ break;
+
+ default:
+ fatal("%d: unrecognized message type %d\n", msg.pid, msg.type);
+ }
+ break;
+ }
+ }
+}
+
// -----------------------------------------------------------------------
// exported
@@ -140,34 +173,31 @@ waitall(Thread *job)
return 0;
}
- 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:
- print(shell.err, "%d: suspended\n", msg.pid);
- job->wait.status = Pstop;
- job->wait.on[i].status = Pstop;
- break;
-
- case Psig:
- print(shell.err, "%d: terminated by signal %d\n", msg.pid, msg.status);
- /* fallthrough */
- case Pdone:
- job->wait.on[i].status = Pdone;
- delwait(job, msg.pid);
- if(!job->wait.len)
- job->wait.status = Pdone;
- break;
-
- default:
- fatal("%d: unrecognized message type %d\n", msg.pid, msg.type);
- }
- break;
- }
+ notify(job, msg);
+ }
+ return 1;
+}
+
+int
+waitfor(Thread *job, int pid)
+{
+ int i;
+ Thread *t;
+ struct WaitMsg msg;
+
+ while(shouldwait(job) && await(-job->pgid, WUNTRACED, &msg)){
+ if(msg.pid == 0){
+ perror("wait for");
+ return 0;
}
+
+ notify(job, msg);
+ /* allow for an early exit */
+ if(msg.pid == pid)
+ return 1;
}
return 1;
+
}
void
@@ -197,30 +227,3 @@ killzombies(void)
}
}
}
-
-#if 0
-int
-waitfor(int pid)
-{
- Thread *t;
- struct WaitMsg w;
-
- if(pid >= 0 && !havewait(pid))
- return 0;
-
- while(await(-proc->pgid, WUNTRACED, &w)){
- delwait(w.pid);
- if(w.pid == pid){
- if(w.signal)
- print(errio, "pid[%d]: signal: %d\n", w.pid, w.status);
- return 1;
- }
- for(t=proc->link; t; t=t->link){
- if(t->pid == w.pid)
- t->pid = -1;
- }
- }
-
- return 0;
-}
-#endif