X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fthreads.texi;h=f8cd04e704e2ccf1b83ddda41e4e27ab4e2b49fd;hb=d115fdd6be51fae8bc292545fd303c0a882cf84e;hp=706f76b7f035e5b7c0e17755dc5c7750aed4d34d;hpb=837e5b7fb902bd749106309ef76a5276c73ca34c;p=pintos-anon diff --git a/doc/threads.texi b/doc/threads.texi index 706f76b..f8cd04e 100644 --- a/doc/threads.texi +++ b/doc/threads.texi @@ -447,7 +447,7 @@ When a thread is added to the ready list that has a higher priority than the currently running thread, the current thread should immediately yield the processor to the new thread. Similarly, when threads are waiting for a lock, semaphore, or condition variable, the -highest priority waiting thread should be woken up first. A thread +highest priority waiting thread should be awakened first. A thread may raise or lower its own priority at any time, but lowering its priority such that it no longer has the highest priority must cause it to immediately yield the CPU. @@ -640,6 +640,45 @@ that happens to follow @func{fail} in memory, which in this case happens to be @func{pass}. @xref{Backtraces}, for more information. + +@item How do interrupts get re-enabled in the new thread following @func{schedule}? + +Every path into @func{schedule} disables interrupts. They eventually +get re-enabled by the next thread to be scheduled. Consider the +possibilities: the new thread is running in @func{switch_thread} (but +see below), which is called by @func{schedule}, which is called by one +of a few possible functions: + +@itemize @bullet +@item +@func{thread_exit}, but we'll never switch back into such a thread, so +it's uninteresting. + +@item +@func{thread_yield}, which immediately restores the interrupt level upon +return from @func{schedule}. + +@item +@func{thread_block}, which is called from multiple places: + +@itemize @minus +@item +@func{sema_down}, which restores the interrupt level before returning. + +@item +@func{idle}, which enables interrupts with an explicit assembly STI +instruction. + +@item +@func{wait} in @file{devices/intq.c}, whose callers are responsible for +re-enabling interrupts. +@end itemize +@end itemize + +There is a special case when a newly created thread runs for the first +time. Such a thread calls @func{intr_enable} as the first action in +@func{kernel_thread}, which is at the bottom of the call stack for every +kernel thread but the first. @end table @menu