From 3a057d12aed586b01d808d55a8b4c700523bbd95 Mon Sep 17 00:00:00 2001
From: rsc <rsc>
Date: Thu, 23 Aug 2007 14:35:28 +0000
Subject: [PATCH] avoid hardcoding init as pid 1 proc[0]

---
 proc.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/proc.c b/proc.c
index d00be89..79fb702 100644
--- a/proc.c
+++ b/proc.c
@@ -11,6 +11,8 @@ struct spinlock proc_table_lock;
 
 struct proc proc[NPROC];
 struct proc *curproc[NCPU];
+static struct proc *initproc;
+
 int nextpid = 1;
 extern void forkret(void);
 extern void forkret1(struct trapframe*);
@@ -162,7 +164,7 @@ userinit(void)
   p->tf->eflags = FL_IF;
   p->tf->esp = p->sz;
   
-  // Push dummy return address to placate gcc.
+  // Make return address readable; needed for some gcc.
   p->tf->esp -= 4;
   *(uint*)(p->mem + p->tf->esp) = 0xefefefef;
 
@@ -170,6 +172,8 @@ userinit(void)
   memmove(p->mem, _binary_initcode_start, (int)_binary_initcode_size);
   safestrcpy(p->name, "initcode", sizeof(p->name));
   p->state = RUNNABLE;
+  
+  initproc = p;
 }
 
 //PAGEBREAK: 42
@@ -346,7 +350,7 @@ proc_exit(void)
   struct proc *p;
   int fd;
 
-  if(cp->pid == 1)
+  if(cp == initproc)
     panic("init exiting");
 
   // Close all open files.
@@ -362,17 +366,19 @@ proc_exit(void)
 
   acquire(&proc_table_lock);
 
-  // Wake up our parent.
+  // Wake up waiting parent.
   for(p = proc; p < &proc[NPROC]; p++)
     if(p->pid == cp->ppid)
       wakeup1(p);
 
-  // Reparent our children to process 1.
-  for(p = proc; p < &proc[NPROC]; p++)
+  // Pass abandoned children to init.
+  for(p = proc; p < &proc[NPROC]; p++){
     if(p->ppid == cp->pid){
-      p->ppid = 1;
-      wakeup1(&proc[1]);  // init
+      p->ppid = initproc->pid;
+      if(p->state == ZOMBIE)
+        wakeup1(initproc);
     }
+  }
 
   // Jump into the scheduler, never to return.
   cp->killed = 0;
-- 
GitLab