X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=blobdiff_plain;f=src%2Fthreads%2Fthread.c;h=87f22b80607b4faba8ae2b1e9f93dc5d6659d8cc;hp=2532463bdbbf5d8f2544cba0b590ae070d2d07e1;hb=8b801a69f8e0c2c4ef7e32a2476786f80f433b8e;hpb=3edcfedb8e62970f3293fa676b6691f8658c3c11 diff --git a/src/threads/thread.c b/src/threads/thread.c index 2532463..87f22b8 100644 --- a/src/threads/thread.c +++ b/src/threads/thread.c @@ -68,7 +68,7 @@ static void init_thread (struct thread *, const char *name, int priority); static bool is_thread (struct thread *) UNUSED; static void *alloc_frame (struct thread *, size_t size); static void schedule (void); -void schedule_tail (struct thread *prev); +void thread_schedule_tail (struct thread *prev); static tid_t allocate_tid (void); /* Initializes the threading system by transforming the code @@ -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); @@ -296,7 +288,7 @@ thread_exit (void) /* Remove thread from all threads list, set our status to dying, and schedule another process. That process will destroy us - when it call schedule_tail(). */ + when it calls thread_schedule_tail(). */ intr_disable (); list_remove (&thread_current()->allelem); thread_current ()->status = THREAD_DYING; @@ -459,6 +451,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 +463,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 @@ -516,7 +513,7 @@ next_thread_to_run (void) After this function and its caller returns, the thread switch is complete. */ void -schedule_tail (struct thread *prev) +thread_schedule_tail (struct thread *prev) { struct thread *cur = running_thread (); @@ -550,8 +547,8 @@ schedule_tail (struct thread *prev) running to some other state. This function finds another thread to run and switches to it. - It's not safe to call printf() until schedule_tail() has - completed. */ + It's not safe to call printf() until thread_schedule_tail() + has completed. */ static void schedule (void) { @@ -565,7 +562,7 @@ schedule (void) if (cur != next) prev = switch_threads (cur, next); - schedule_tail (prev); + thread_schedule_tail (prev); } /* Returns a tid to use for a new thread. */