diff options
author | davidxu <davidxu@FreeBSD.org> | 2010-10-23 13:16:39 +0000 |
---|---|---|
committer | davidxu <davidxu@FreeBSD.org> | 2010-10-23 13:16:39 +0000 |
commit | 841633e7b6a19e5a095062370dd1a64cbe0d84ff (patch) | |
tree | 4147331061e1ffc446d09074add0b9e0239f0cd7 /sys/kern/kern_kthread.c | |
parent | 26a4fa1adc1004ceee6d2d1bf13287d27ea3cd42 (diff) | |
download | FreeBSD-src-841633e7b6a19e5a095062370dd1a64cbe0d84ff.zip FreeBSD-src-841633e7b6a19e5a095062370dd1a64cbe0d84ff.tar.gz |
In thr_exit() and kthread_exit(), only remove thread from
hash if it can directly exit, otherwise let exit1() do it.
The change should be in r213950, but for unknown reason,
it was lost.
Diffstat (limited to 'sys/kern/kern_kthread.c')
-rw-r--r-- | sys/kern/kern_kthread.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index 9ab0922..be40c80 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$"); #include <sys/mutex.h> #include <sys/proc.h> #include <sys/resourcevar.h> +#include <sys/rwlock.h> #include <sys/signalvar.h> #include <sys/sx.h> #include <sys/unistd.h> @@ -315,17 +316,20 @@ kthread_exit(void) p = curthread->td_proc; - tidhash_remove(curthread); /* A module may be waiting for us to exit. */ wakeup(curthread); + rw_wlock(&tidhash_lock); PROC_LOCK(p); if (p->p_numthreads == 1) { PROC_UNLOCK(p); + rw_wunlock(&tidhash_lock); kproc_exit(0); /* NOTREACHED. */ } + LIST_REMOVE(curthread, td_hash); + rw_wunlock(&tidhash_lock); PROC_SLOCK(p); thread_exit(); } |