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
This commit is contained in:
christos 2009-10-03 23:49:50 +00:00
parent c9bb67bb7b
commit 85ddadbfdc
1 changed files with 12 additions and 18 deletions

View File

@ -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,22 +353,16 @@ pthread_create(pthread_t *thread, const pthread_attr_t *attr,
*/
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;
if (newthread->pt_lwpctl->lc_curcpu ==
LWPCTL_CPU_EXITED ||
(_lwp_kill(newthread->pt_lid, 0) == -1 &&
errno == ESRCH))
break;
}
} else
if (newthread)
PTQ_REMOVE(&pthread__deadqueue, newthread, pt_deadq);
pthread_mutex_unlock(&pthread__deadqueue_lock);
}