summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_kthread.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2010-10-23 13:16:39 +0000
committerdavidxu <davidxu@FreeBSD.org>2010-10-23 13:16:39 +0000
commit841633e7b6a19e5a095062370dd1a64cbe0d84ff (patch)
tree4147331061e1ffc446d09074add0b9e0239f0cd7 /sys/kern/kern_kthread.c
parent26a4fa1adc1004ceee6d2d1bf13287d27ea3cd42 (diff)
downloadFreeBSD-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.c6
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();
}
OpenPOWER on IntegriCloud