Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 23 Oct 2010 13:16:39 +0000 (UTC)
From:      David Xu <davidxu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r214238 - head/sys/kern
Message-ID:  <201010231316.o9NDGd1B087831@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201010231316.o9NDGd1B087831>