svn commit: r214238 - head/sys/kern
David Xu
davidxu at FreeBSD.org
Sat Oct 23 13:16:40 UTC 2010
Author: davidxu
Date: Sat Oct 23 13:16:39 2010
New Revision: 214238
URL: http://svn.freebsd.org/changeset/base/214238
Log:
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.
Modified:
head/sys/kern/kern_kthread.c
head/sys/kern/kern_thr.c
Modified: head/sys/kern/kern_kthread.c
==============================================================================
--- head/sys/kern/kern_kthread.c Sat Oct 23 12:27:39 2010 (r214237)
+++ head/sys/kern/kern_kthread.c Sat Oct 23 13:16:39 2010 (r214238)
@@ -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();
}
Modified: head/sys/kern/kern_thr.c
==============================================================================
--- head/sys/kern/kern_thr.c Sat Oct 23 12:27:39 2010 (r214237)
+++ head/sys/kern/kern_thr.c Sat Oct 23 13:16:39 2010 (r214238)
@@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$");
#include <sys/proc.h>
#include <sys/posix4.h>
#include <sys/resourcevar.h>
+#include <sys/rwlock.h>
#include <sys/sched.h>
#include <sys/sysctl.h>
#include <sys/smp.h>
@@ -284,23 +285,23 @@ thr_exit(struct thread *td, struct thr_e
kern_umtx_wake(td, uap->state, INT_MAX, 0);
}
- tidhash_remove(td);
-
+ rw_wlock(&tidhash_lock);
PROC_LOCK(p);
- tdsigcleanup(td);
- PROC_SLOCK(p);
-
/*
* Shutting down last thread in the proc. This will actually
* call exit() in the trampoline when it returns.
*/
if (p->p_numthreads != 1) {
+ LIST_REMOVE(td, td_hash);
+ rw_wunlock(&tidhash_lock);
+ tdsigcleanup(td);
+ PROC_SLOCK(p);
thread_stopped(p);
thread_exit();
/* NOTREACHED */
}
- PROC_SUNLOCK(p);
PROC_UNLOCK(p);
+ rw_wunlock(&tidhash_lock);
return (0);
}
More information about the svn-src-head
mailing list