diff options
| -rw-r--r-- | sys/src/9/port/proc.c | 13 | ||||
| -rw-r--r-- | sys/src/9/port/sysproc.c | 4 |
2 files changed, 12 insertions, 5 deletions
diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c index adc085db2..f67dc9f3a 100644 --- a/sys/src/9/port/proc.c +++ b/sys/src/9/port/proc.c @@ -1130,7 +1130,14 @@ pexit(char *exitstr, int freemem) * if not a kernel process and have a parent, * do some housekeeping. */ - if(up->kp == 0 && up->parentpid != 0) { + if(up->kp) + goto Nowait; + + p = up->parent; + if(p != nil){ + if(p->pid != up->parentpid || p->state == Broken) + goto Nowait; + wq = smalloc(sizeof(Waitq)); wq->w.pid = up->pid; utime = up->time[TUser] + up->time[TCUser]; @@ -1143,7 +1150,6 @@ pexit(char *exitstr, int freemem) else wq->w.msg[0] = '\0'; - p = up->parent; lock(&p->exl); /* * Check that parent is still alive. @@ -1171,12 +1177,13 @@ pexit(char *exitstr, int freemem) if(wq != nil) free(wq); } - else if(up->kp == 0 && up->parent == nil){ + else if(up->parentpid == 0){ if(exitstr == nil) exitstr = "unknown"; panic("boot process died: %s", exitstr); } +Nowait: if(!freemem) addbroken(up); diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index 7625b946c..e5aa537d9 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -181,9 +181,9 @@ sysrfork(va_list list) */ forkchild(p, up->dbgreg); - p->parent = up; + p->parentpid = up->pid; if((flag&RFNOWAIT) == 0){ - p->parentpid = up->pid; + p->parent = up; lock(&up->exl); up->nchild++; unlock(&up->exl); |
