From b1fb19b6df716c0ad30b05236c356bc34457c70b Mon Sep 17 00:00:00 2001
From: rsc <rsc>
Date: Thu, 23 Aug 2007 14:40:30 +0000
Subject: [PATCH] Use parent pointer instead of ppid.

---
 proc.c | 16 +++++++---------
 proc.h |  2 +-
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/proc.c b/proc.c
index 79fb702..d74a5e9 100644
--- a/proc.c
+++ b/proc.c
@@ -118,7 +118,7 @@ copyproc(struct proc *p)
   np->tf = (struct trapframe*)(np->kstack + KSTACKSIZE) - 1;
 
   if(p){  // Copy process state from p.
-    np->ppid = p->pid;
+    np->parent = p;
     memmove(np->tf, p->tf, sizeof(*np->tf));
   
     np->sz = p->sz;
@@ -366,15 +366,13 @@ proc_exit(void)
 
   acquire(&proc_table_lock);
 
-  // Wake up waiting parent.
-  for(p = proc; p < &proc[NPROC]; p++)
-    if(p->pid == cp->ppid)
-      wakeup1(p);
+  // Parent might be sleeping in proc_wait.
+  wakeup1(cp->parent);
 
   // Pass abandoned children to init.
   for(p = proc; p < &proc[NPROC]; p++){
-    if(p->ppid == cp->pid){
-      p->ppid = initproc->pid;
+    if(p->parent == cp){
+      p->parent = initproc;
       if(p->state == ZOMBIE)
         wakeup1(initproc);
     }
@@ -403,7 +401,7 @@ proc_wait(void)
       p = &proc[i];
       if(p->state == UNUSED)
         continue;
-      if(p->ppid == cp->pid){
+      if(p->parent == cp){
         if(p->state == ZOMBIE){
           // Found one.
           kfree(p->mem, p->sz);
@@ -411,7 +409,7 @@ proc_wait(void)
           pid = p->pid;
           p->state = UNUSED;
           p->pid = 0;
-          p->ppid = 0;
+          p->parent = 0;
           p->name[0] = 0;
           release(&proc_table_lock);
           return pid;
diff --git a/proc.h b/proc.h
index 01bff4a..9750c15 100644
--- a/proc.h
+++ b/proc.h
@@ -33,7 +33,7 @@ struct proc {
   char *kstack;             // Bottom of kernel stack for this process
   enum proc_state state;    // Process state
   int pid;                  // Process ID
-  int ppid;                 // Parent pid
+  struct proc *parent;      // Parent process
   void *chan;               // If non-zero, sleeping on chan
   int killed;               // If non-zero, have been killed
   struct file *ofile[NOFILE];  // Open files
-- 
GitLab