]> Devi Nivas Git - cs3210-lab0.git/commitdiff
this might fix the reported deadlock, though I can't reproduce it.
authorRobert Morris <rtm@csail.mit.edu>
Thu, 8 Sep 2016 18:22:38 +0000 (14:22 -0400)
committerRobert Morris <rtm@csail.mit.edu>
Thu, 8 Sep 2016 18:22:38 +0000 (14:22 -0400)
proc.c

diff --git a/proc.c b/proc.c
index 9e9552936c5698bcd185b02a1580ccfaaab0905d..eee79af7d2c6d309049d13b3aec077983de94566 100644 (file)
--- a/proc.c
+++ b/proc.c
@@ -82,6 +82,12 @@ userinit(void)
   acquire(&ptable.lock);
 
   p = allocproc();
+
+  // release the lock in case namei() sleeps.
+  // the lock isn't needed because no other
+  // thread will look at an EMBRYO proc.
+  release(&ptable.lock);
+  
   initproc = p;
   if((p->pgdir = setupkvm()) == 0)
     panic("userinit: out of memory?");
@@ -99,6 +105,12 @@ userinit(void)
   safestrcpy(p->name, "initcode", sizeof(p->name));
   p->cwd = namei("/");
 
+  // this assignment to p->state lets other cores
+  // run this process. the acquire forces the above
+  // writes to be visible, and the lock is also needed
+  // because the assignment might not be atomic.
+  acquire(&ptable.lock);
+
   p->state = RUNNABLE;
 
   release(&ptable.lock);
@@ -141,6 +153,8 @@ fork(void)
     return -1;
   }
 
+  release(&ptable.lock);
+
   // Copy process state from p.
   if((np->pgdir = copyuvm(proc->pgdir, proc->sz)) == 0){
     kfree(np->kstack);
@@ -165,6 +179,8 @@ fork(void)
 
   pid = np->pid;
 
+  acquire(&ptable.lock);
+
   np->state = RUNNABLE;
 
   release(&ptable.lock);
@@ -227,7 +243,7 @@ wait(void)
 
   acquire(&ptable.lock);
   for(;;){
-    // Scan through table looking for zombie children.
+    // Scan through table looking for exited children.
     havekids = 0;
     for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
       if(p->parent != proc)