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);
 }
 
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to