summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/port/proc.c13
-rw-r--r--sys/src/9/port/sysproc.c4
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);