Fix race condition.
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 14 Oct 2004 00:43:07 +0000 (00:43 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 14 Oct 2004 00:43:07 +0000 (00:43 +0000)
solutions/p1-2.patch

index b7e9c798f6674037242d2282e1c9e3cdd09404a5..a2a040d45f5504a02eb15627c552982e9bfa501f 100644 (file)
@@ -76,12 +76,12 @@ diff -X pat -urpN pintos.orig/src/threads/thread.c pintos/src/threads/thread.c
  
    /* Stack frame for kernel_thread(). */
    kf = alloc_frame (t, sizeof *kf);
-@@ -224,16 +226,33 @@ thread_tid (void) 
+@@ -224,16 +226,34 @@ thread_tid (void) 
  void
  thread_exit (void) 
  {
 +  struct thread *t = thread_current ();
-+  list_elem *e;
++  list_elem *e, *next;
 +
    ASSERT (!intr_context ());
  
@@ -93,10 +93,11 @@ diff -X pat -urpN pintos.orig/src/threads/thread.c pintos/src/threads/thread.c
 +  latch_release (&t->ready_to_die);
 +
 +  /* Notify our children that they can die. */
-+  for (e = list_begin (&t->children); e != list_end (&t->children);
-+       e = list_next (e)) 
++  for (e = list_begin (&t->children); e != list_end (&t->children); e = next)
 +    {
 +      struct thread *child = list_entry (e, struct thread, children_elem);
++      next = list_next (e);
++      list_remove (e);
 +      sema_up (&child->can_die); 
 +    }
 +