]> Devi Nivas Git - cs3210-lab0.git/commitdiff
fix various bugs
authorrsc <rsc>
Wed, 8 Aug 2007 08:57:37 +0000 (08:57 +0000)
committerrsc <rsc>
Wed, 8 Aug 2007 08:57:37 +0000 (08:57 +0000)
BUGS
proc.c

diff --git a/BUGS b/BUGS
index daa26ca95cdc60f6c5e4bc3c311d6c7cc8a63cdb..0c6f14b4a4f871ed745ca57126ed9a8bcddd3f51 100644 (file)
--- a/BUGS
+++ b/BUGS
@@ -12,15 +12,6 @@ main.c:
        cpus[0] -> cpus[bcpu]
 
 proc.c:
-       comment at top of scheduler() should say
-               via longjmp back to the scheduler
-       not
-               via longjmp back to the top of scheduler
-
-       sched should panic if state == RUNNING.
-
-       forkret comment should say "Return" not "return"
-       
        as a consequence of the implementation of proc_kill,
        any loop calling sleep should check for p->killed
        and be able to break out with an error return.
@@ -28,9 +19,6 @@ proc.c:
        can swap procdump up after proc_kill
        and then have proc_exit and proc_wait on same sheet
 
-       proc_exit should wake up proc[1] if any
-       reparenting was done.
-
        sched ->  switch2scheduler?  or just switch?
 
        factor out switching and scheduling code from process code
diff --git a/proc.c b/proc.c
index c7b6c853a07f5b42e75cf8cb005bf7012673a8a9..9eaca99ec26b5c199ebdbac22de50cfa17dd647f 100644 (file)
--- a/proc.c
+++ b/proc.c
@@ -207,8 +207,10 @@ sched(void)
 {
   struct proc *p = curproc[cpu()];
 
+  if(p->state == RUNNING)
+    panic("sched running");
   if(!holding(&proc_table_lock))
-    panic("sched");
+    panic("sched proc_table_lock");
   if(cpus[cpu()].nlock != 1)
     panic("sched locks");
 
@@ -334,6 +336,9 @@ proc_exit(void)
   struct proc *cp = curproc[cpu()];
   int fd;
 
+  if(cp->pid == 1)
+    panic("init exiting");
+
   // Close all open files.
   for(fd = 0; fd < NOFILE; fd++){
     if(cp->ofile[fd]){
@@ -354,8 +359,10 @@ proc_exit(void)
 
   // Reparent our children to process 1.
   for(p = proc; p < &proc[NPROC]; p++)
-    if(p->ppid == cp->pid)
+    if(p->ppid == cp->pid){
       p->ppid = 1;
+      wakeup1(&proc[1]);  // init
+    }
 
   // Jump into the scheduler, never to return.
   cp->killed = 0;