thread: Properly protect 'all_list' around insertion.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 12 Feb 2011 18:03:53 +0000 (10:03 -0800)
committerBen Pfaff <blp@cs.stanford.edu>
Sat, 12 Feb 2011 18:25:31 +0000 (10:25 -0800)
Reported by Francis Russell <fpr02@doc.ic.ac.uk>.

src/threads/thread.c

index 955ccdcfef958179dd285de2f4049e96c37c77ba..d68c123fb2476420d09557f4f52d4a6fb12949f4 100644 (file)
@@ -459,6 +459,8 @@ is_thread (struct thread *t)
 static void
 init_thread (struct thread *t, const char *name, int priority)
 {
 static void
 init_thread (struct thread *t, const char *name, int priority)
 {
+  enum intr_level old_level;
+
   ASSERT (t != NULL);
   ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
   ASSERT (name != NULL);
   ASSERT (t != NULL);
   ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
   ASSERT (name != NULL);
@@ -469,7 +471,10 @@ init_thread (struct thread *t, const char *name, int priority)
   t->stack = (uint8_t *) t + PGSIZE;
   t->priority = priority;
   t->magic = THREAD_MAGIC;
   t->stack = (uint8_t *) t + PGSIZE;
   t->priority = priority;
   t->magic = THREAD_MAGIC;
+
+  old_level = intr_disable ();
   list_push_back (&all_list, &t->allelem);
   list_push_back (&all_list, &t->allelem);
+  intr_set_level (old_level);
 }
 
 /* Allocates a SIZE-byte frame at the top of thread T's stack and
 }
 
 /* Allocates a SIZE-byte frame at the top of thread T's stack and