X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Fthread.c;h=eb9646520de0e2b0b2af7c3254451ff5f86eefe1;hb=2e6303a4b957eb770b0cab4172bd43a7c01c927d;hp=336be0392804907a9c560d87c1256f500991a8bc;hpb=2f06c82f2c3e67ab8748a743cef1990740cab70e;p=pintos-anon diff --git a/src/threads/thread.c b/src/threads/thread.c index 336be03..eb96465 100644 --- a/src/threads/thread.c +++ b/src/threads/thread.c @@ -13,7 +13,6 @@ #include "threads/synch.h" #ifdef USERPROG #include "userprog/process.h" -#include "userprog/gdt.h" #endif /* Random value for struct thread's `magic' member. @@ -50,7 +49,6 @@ static struct thread *next_thread_to_run (void); static void init_thread (struct thread *, const char *name, int priority); static bool is_thread (struct thread *); static void *alloc_frame (struct thread *, size_t size); -static void destroy_thread (struct thread *); static void schedule (void); void schedule_tail (struct thread *prev); static tid_t allocate_tid (void); @@ -70,15 +68,13 @@ thread_init (void) ASSERT (intr_get_level () == INTR_OFF); lock_init (&tid_lock, "tid"); + list_init (&ready_list); /* Set up a thread structure for the running thread. */ initial_thread = running_thread (); init_thread (initial_thread, "main", PRI_DEFAULT); initial_thread->status = THREAD_RUNNING; initial_thread->tid = allocate_tid (); - - /* Initialize run queue. */ - list_init (&ready_list); } /* Starts preemptive thread scheduling by enabling interrupts. @@ -201,6 +197,10 @@ thread_exit (void) { ASSERT (!intr_context ()); +#ifdef USERPROG + process_exit (); +#endif + /* Just set our status to dying and schedule another process. We will be destroyed during the call to schedule_tail(). */ intr_disable (); @@ -336,20 +336,6 @@ next_thread_to_run (void) return list_entry (list_pop_front (&ready_list), struct thread, elem); } -/* Destroys T, which must not be the running thread. */ -static void -destroy_thread (struct thread *t) -{ - ASSERT (is_thread (t)); - ASSERT (t != thread_current ()); - -#ifdef USERPROG - process_destroy (t); -#endif - if (t != initial_thread) - palloc_free (t); -} - /* Completes a thread switch by activating the new thread's page tables, and, if the previous thread is dying, destroying it. @@ -377,11 +363,15 @@ schedule_tail (struct thread *prev) process_activate (); #endif - /* If the thread we switched from is dying, destroy it. - This must happen late because it's not a good idea to - e.g. destroy the page table you're currently using. */ + /* If the thread we switched from is dying, destroy its struct + thread. This must happen late so that thread_exit() doesn't + pull out the rug under itself. */ if (prev != NULL && prev->status == THREAD_DYING) - destroy_thread (prev); + { + ASSERT (prev != cur); + if (prev != initial_thread) + palloc_free (prev); + } } /* Schedules a new process. At entry, interrupts must be off and