Module Name:    src
Committed By:   christos
Date:           Sat Oct  3 23:49:50 UTC 2009

Modified Files:
        src/lib/libpthread: pthread.c

Log Message:
Don't just look only at the first element in the deadqueue to find lwp's
to reuse, because if we lose the race with the kernel we are never going
to reuse any elements. Look in the whole list instead.
XXX: should be pulled up to 5.x


To generate a diff of this commit:
cvs rdiff -u -r1.112 -r1.113 src/lib/libpthread/pthread.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libpthread/pthread.c
diff -u src/lib/libpthread/pthread.c:1.112 src/lib/libpthread/pthread.c:1.113
--- src/lib/libpthread/pthread.c:1.112	Thu Jul  2 05:59:00 2009
+++ src/lib/libpthread/pthread.c	Sat Oct  3 19:49:50 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: pthread.c,v 1.112 2009/07/02 09:59:00 joerg Exp $	*/
+/*	$NetBSD: pthread.c,v 1.113 2009/10/03 23:49:50 christos Exp $	*/
 
 /*-
  * Copyright (c) 2001, 2002, 2003, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__RCSID("$NetBSD: pthread.c,v 1.112 2009/07/02 09:59:00 joerg Exp $");
+__RCSID("$NetBSD: pthread.c,v 1.113 2009/10/03 23:49:50 christos Exp $");
 
 #define	__EXPOSE_STACK	1
 
@@ -353,23 +353,17 @@
 	 */
 	if (!PTQ_EMPTY(&pthread__deadqueue)) {
 		pthread_mutex_lock(&pthread__deadqueue_lock);
-		newthread = PTQ_FIRST(&pthread__deadqueue);
-		if (newthread != NULL) {
-			PTQ_REMOVE(&pthread__deadqueue, newthread, pt_deadq);
-			pthread_mutex_unlock(&pthread__deadqueue_lock);
+		PTQ_FOREACH(newthread, &pthread__deadqueue, pt_deadq) {
 			/* Still running? */
-			if (newthread->pt_lwpctl->lc_curcpu !=
-			    LWPCTL_CPU_EXITED &&
-			    (_lwp_kill(newthread->pt_lid, 0) == 0 ||
-			    errno != ESRCH)) {
-				pthread_mutex_lock(&pthread__deadqueue_lock);
-				PTQ_INSERT_TAIL(&pthread__deadqueue,
-				    newthread, pt_deadq);
-				pthread_mutex_unlock(&pthread__deadqueue_lock);
-				newthread = NULL;
-			}
-		} else
-			pthread_mutex_unlock(&pthread__deadqueue_lock);
+			if (newthread->pt_lwpctl->lc_curcpu ==
+			    LWPCTL_CPU_EXITED ||
+			    (_lwp_kill(newthread->pt_lid, 0) == -1 &&
+			    errno == ESRCH))
+				break;
+		}
+		if (newthread)
+			PTQ_REMOVE(&pthread__deadqueue, newthread, pt_deadq);
+		pthread_mutex_unlock(&pthread__deadqueue_lock);
 	}
 
 	/*

Reply via email to