cvs commit: src/sys/kern kern_sig.c kern_synch.c src/sys/sys proc.h src/sys/vfs/procfs procfs_ctl.c
Matthew Dillon
dillon at apollo.backplane.com
Tue Mar 13 09:51:39 PDT 2007
:...
: Now we count all sleeping threads as stopped and also set LWP_WSTOP to
: indicate so. These threads will stop before return to userland.
: Running threads (including the current one) will eventually stop when
: returning to userland and will increase p_nstopped. The last thread
: stopping will then send a signal to the parent process.
:
: Discussed-with: Thomas E. Spanjaard <tgen at netphreax.net>
Also note that there is code somewhere to handle deep races in the
actual descheduling of the thread itself. Please make sure those
race checks remain intact.
It comes down to the TDF_RUNNING flag in the thread structure. This
flag is adjusted by the thread switch code in platform/pc32/i386/swtch.s,
e.g. on line 300. It's very simple... the TDF_RUNNING flag for the
previously running thread is not cleared until AFTER the switch code
has switched to the next running thread's stack. The ordering is
significant because most other process related flags are set BEFORE the
actual exiting process deschedules itself, and thus create a race
condition and are not suitable to determine when the related structures
can be deallocated.
The main check is in kern/kern_exit.c line 500 or so, TDF_RUNNING
(and other flags) are checked to ensure that there is no race between
the actual descheduling of the thread and exit1()'s reclamation of the
resources.
It is pretty well documented in-code but something I just wanted to
bring your attention to since you are working on the exit code.
-Matt
More information about the Commits
mailing list