Improve VMware GSX Server support.
[pintos-anon] / src / threads / thread.c
index 85f107d19ff01e988c9eaa3394522c56afe753ef..1b56f98508e16922de88d299cf02ec2f6f0a22f1 100644 (file)
 
 /* List of processes in THREAD_READY state, that is, processes
    that are ready to run but not actually running. */
-static struct list run_queue;
+static struct list ready_list;
 
 /* Idle thread. */
 static struct thread *idle_thread;      /* Thread. */
 static void idle (void *aux UNUSED);    /* Thread function. */
 
+/* Initial thread.
+   This is the thread running main(). */
+static struct thread *initial_thread;
+
 /* Stack frame for kernel_thread(). */
 struct kernel_thread_frame 
   {
@@ -57,17 +61,15 @@ void schedule_tail (struct thread *prev);
 void
 thread_init (void) 
 {
-  struct thread *t;
-  
   ASSERT (intr_get_level () == INTR_OFF);
 
   /* Set up a thread structure for the running thread. */
-  t = running_thread ();
-  init_thread (t, "main");
-  t->status = THREAD_RUNNING;
+  initial_thread = running_thread ();
+  init_thread (initial_thread, "main");
+  initial_thread->status = THREAD_RUNNING;
 
   /* Initialize run queue. */
-  list_init (&run_queue);
+  list_init (&ready_list);
 }
 
 /* Starts preemptive thread scheduling by enabling interrupts.
@@ -182,7 +184,7 @@ thread_unblock (struct thread *t)
   old_level = intr_disable ();
   if (t->status == THREAD_BLOCKED) 
     {
-      list_push_back (&run_queue, &t->elem);
+      list_push_back (&ready_list, &t->elem);
       t->status = THREAD_READY;
     }
   intr_set_level (old_level);
@@ -241,7 +243,7 @@ thread_yield (void)
   ASSERT (!intr_context ());
 
   old_level = intr_disable ();
-  list_push_back (&run_queue, &cur->elem);
+  list_push_back (&ready_list, &cur->elem);
   cur->status = THREAD_READY;
   schedule ();
   intr_set_level (old_level);
@@ -361,10 +363,10 @@ alloc_frame (struct thread *t, size_t size)
 static struct thread *
 next_thread_to_run (void) 
 {
-  if (list_empty (&run_queue))
+  if (list_empty (&ready_list))
     return idle_thread;
   else
-    return list_entry (list_pop_front (&run_queue), struct thread, elem);
+    return list_entry (list_pop_front (&ready_list), struct thread, elem);
 }
 
 /* Destroys T, which must be in the dying state and must not be
@@ -379,7 +381,8 @@ destroy_thread (struct thread *t)
 #ifdef USERPROG
   addrspace_destroy (t);
 #endif
-  palloc_free (t);
+  if (t != initial_thread)
+    palloc_free (t);
 }
 
 /* Completes a thread switch by activating the new thread's page