X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fthreads%2Fthread.c;h=1e5a7d27179e928cb462a813200ed1a8518ccbf4;hb=601d95be13aa18bfdea51930f86cccdde1c01f5e;hp=b0d5a9138eb6e5a438fda9eabb3ec8e67d1ca519;hpb=46dd95686f3d7b3dd1c8f9ed72b01cd32d8172f3;p=pintos-anon diff --git a/src/threads/thread.c b/src/threads/thread.c index b0d5a91..1e5a7d2 100644 --- a/src/threads/thread.c +++ b/src/threads/thread.c @@ -118,13 +118,15 @@ thread_print_stats (void) /* Creates a new kernel thread named NAME with the given initial PRIORITY, which executes FUNCTION passing AUX as the argument, - and adds it to the ready queue. If thread_start() has been - called, then the new thread may be scheduled before - thread_create() returns. It could even exit before - thread_create() returns. Use a semaphore or some other form - of synchronization if you need to ensure ordering. Returns - the thread identifier for the new thread, or TID_ERROR if - creation fails. + and adds it to the ready queue. Returns the thread identifier + for the new thread, or TID_ERROR if creation fails. + + If thread_start() has been called, then the new thread may be + scheduled before thread_create() returns. It could even exit + before thread_create() returns. Contrariwise, the original + thread may run for any amount of time before the new thread is + scheduled. Use a semaphore or some other form of + synchronization if you need to ensure ordering. The code provided sets the new thread's `priority' member to PRIORITY, but no actual priority scheduling is implemented. @@ -285,7 +287,8 @@ idle (void *aux UNUSED) thread_block (); intr_enable (); - /* Use CPU `hlt' instruction to wait for interrupt. */ + /* Use CPU `hlt' instruction to wait for interrupt. + See [IA32-v2a] "HLT" and [IA32-v3] 7.7. */ asm ("hlt"); } } @@ -311,7 +314,7 @@ running_thread (void) down to the start of a page. Because `struct thread' is always at the beginning of a page and the stack pointer is somewhere in the middle, this locates the curent thread. */ - asm ("movl %%esp, %0\n" : "=g" (esp)); + asm ("mov %0, %%esp" : "=g" (esp)); return pg_round_down (esp); } @@ -376,6 +379,10 @@ next_thread_to_run (void) the first time a thread is scheduled it is called by switch_entry() (see switch.S). + It's not safe to call printf() until the thread switch is + complete. In practice that means that printf()s should be + added at the end of the function. + After this function and its caller returns, the thread switch is complete. */ void @@ -407,7 +414,10 @@ schedule_tail (struct thread *prev) /* Schedules a new process. At entry, interrupts must be off and the running process's state must have been changed from running to some other state. This function finds another - thread to run and switches to it. */ + thread to run and switches to it. + + It's not safe to call printf() until schedule_tail() has + completed. */ static void schedule (void) {