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>.

solutions/p1.patch
solutions/p3.patch
solutions/p4.patch
src/threads/thread.c

index 2e039ebea7a5f0430919bd0390602aff09424b35..046989fbba893eaec65b4f849aeaef170ca09021 100644 (file)
@@ -654,7 +654,7 @@ diff -Nur ../../src/threads/thread.c src/threads/thread.c
  }
  \f
  /* Idle thread.  Executes when no other thread is ready to run.
-@@ -467,8 +613,10 @@
+@@ -467,11 +613,13 @@
    t->status = THREAD_BLOCKED;
    strlcpy (t->name, name, sizeof t->name);
    t->stack = (uint8_t *) t + PGSIZE;
@@ -663,7 +663,10 @@ diff -Nur ../../src/threads/thread.c src/threads/thread.c
    t->magic = THREAD_MAGIC;
 +  sema_init (&t->timer_sema, 0);
 +  list_init (&t->donors);
+   old_level = intr_disable ();
    list_push_back (&all_list, &t->allelem);
+   intr_set_level (old_level);
  }
  
 @@ -495,8 +643,14 @@
index d3a5ddee4b8075905b2c477bebb86a649dce6986..a62adfd8714e7c874f5cef8a180b2ba64d1714ee 100644 (file)
@@ -186,13 +186,15 @@ diff -u src/threads/thread.c~ src/threads/thread.c
  #endif
  
    /* Remove thread from all threads list, set our status to dying,
-@@ -406,17 +410,28 @@ is_thread (struct thread *t)
+@@ -406,23 +410,34 @@ is_thread (struct thread *t)
  /* Does basic initialization of T as a blocked thread named
     NAME. */
  static void
 -init_thread (struct thread *t, const char *name, int priority)
 +init_thread (struct thread *t, const char *name, int priority, tid_t tid)
  {
+   enum intr_level old_level;
    ASSERT (t != NULL);
    ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
    ASSERT (name != NULL);
@@ -214,6 +216,10 @@ diff -u src/threads/thread.c~ src/threads/thread.c
 +  list_init (&t->mappings);
 +  t->next_handle = 2;
    t->magic = THREAD_MAGIC;
+   old_level = intr_disable ();
+   list_push_back (&all_list, &t->allelem);
+   intr_set_level (old_level);
  }
  
 Index: src/threads/thread.h
index 36bc258ed98d6b95480d61a22624ff4abdb9585d..b94410b937d2629aa47de76bdbae127036420dfa 100644 (file)
@@ -2134,13 +2134,15 @@ diff -u src/threads/thread.c~ src/threads/thread.c
  #endif
  
    /* Remove thread from all threads list, set our status to dying,
-@@ -406,17 +410,29 @@ is_thread (struct thread *t)
+@@ -406,23 +410,35 @@ is_thread (struct thread *t)
  /* Does basic initialization of T as a blocked thread named
     NAME. */
  static void
 -init_thread (struct thread *t, const char *name, int priority)
 +init_thread (struct thread *t, const char *name, int priority, tid_t tid)
  {
+   enum intr_level old_level;
    ASSERT (t != NULL);
    ASSERT (PRI_MIN <= priority && priority <= PRI_MAX);
    ASSERT (name != NULL);
@@ -2163,6 +2165,10 @@ diff -u src/threads/thread.c~ src/threads/thread.c
 +  t->next_handle = 2;
 +  t->wd = NULL;
    t->magic = THREAD_MAGIC;
+   old_level = intr_disable ();
+   list_push_back (&all_list, &t->allelem);
+   intr_set_level (old_level);
  }
  
 Index: src/threads/thread.h
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)
 {
+  enum intr_level old_level;
+
   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;
+
+  old_level = intr_disable ();
   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