thread: Do not disable interrupts unnecessarily while initializing stack.
authorBen Pfaff <blp@cs.stanford.edu>
Sat, 12 Feb 2011 18:04:27 +0000 (10:04 -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
src/threads/thread.c

index 046989fbba893eaec65b4f849aeaef170ca09021..30c0ddd7efbea12dc2746d6ff9a811f81653d62b 100644 (file)
@@ -459,7 +459,7 @@ diff -Nur ../../src/threads/thread.c src/threads/thread.c
  }
  
  /* Prints thread statistics. */
-@@ -166,12 +214,13 @@
+@@ -166,11 +214,12 @@
  thread_create (const char *name, int priority,
                 thread_func *function, void *aux) 
  {
@@ -468,9 +468,7 @@ diff -Nur ../../src/threads/thread.c src/threads/thread.c
    struct kernel_thread_frame *kf;
    struct switch_entry_frame *ef;
    struct switch_threads_frame *sf;
--  tid_t tid;
-   enum intr_level old_level;
-+  tid_t tid;
+   tid_t tid;
  
    ASSERT (function != NULL);
  
index d68c123fb2476420d09557f4f52d4a6fb12949f4..87f22b80607b4faba8ae2b1e9f93dc5d6659d8cc 100644 (file)
@@ -171,7 +171,6 @@ thread_create (const char *name, int priority,
   struct switch_entry_frame *ef;
   struct switch_threads_frame *sf;
   tid_t tid;
-  enum intr_level old_level;
 
   ASSERT (function != NULL);
 
@@ -184,11 +183,6 @@ thread_create (const char *name, int priority,
   init_thread (t, name, priority);
   tid = t->tid = allocate_tid ();
 
-  /* Prepare thread for first run by initializing its stack.
-     Do this atomically so intermediate values for the 'stack' 
-     member cannot be observed. */
-  old_level = intr_disable ();
-
   /* Stack frame for kernel_thread(). */
   kf = alloc_frame (t, sizeof *kf);
   kf->eip = NULL;
@@ -204,8 +198,6 @@ thread_create (const char *name, int priority,
   sf->eip = switch_entry;
   sf->ebp = 0;
 
-  intr_set_level (old_level);
-
   /* Add to run queue. */
   thread_unblock (t);