Decouple the thread stack [de]allocating functions from the 'dead threads list'

lock. It's not really necessary and we don't need the added complexity
or potential for deadlocks.

Approved by:	re/blanket libthr
This commit is contained in:
mtm 2003-05-26 00:37:07 +00:00
parent 3440accd67
commit 23f7669444
4 changed files with 16 additions and 7 deletions

View File

@ -119,11 +119,10 @@ _pthread_create(pthread_t * thread, const pthread_attr_t * attr,
new_thread->arch_id = _set_curthread(&new_thread->ctx, new_thread, &ret);
if (ret != 0) {
if (pattr->stackaddr_attr == NULL) {
/* XXX - We really need to decouple from this lock */
DEAD_LIST_LOCK;
STACK_LOCK;
_thread_stack_free(new_thread->stack,
pattr->stacksize_attr, pattr->guardsize_attr);
DEAD_LIST_UNLOCK;
STACK_UNLOCK;
}
free(new_thread);
return (ret);

View File

@ -113,6 +113,7 @@ _thread_gc(pthread_addr_t arg)
* the caller to pthread_create() and has not
* been destroyed yet:
*/
STACK_LOCK;
if (pthread->attr.stackaddr_attr == NULL &&
pthread->stack != NULL) {
_thread_stack_free(pthread->stack,
@ -120,6 +121,7 @@ _thread_gc(pthread_addr_t arg)
pthread->attr.guardsize_attr);
pthread->stack = NULL;
}
STACK_UNLOCK;
/*
* If the thread has not been detached, leave

View File

@ -578,6 +578,14 @@ SCLASS void *_usrstack
;
#endif
SCLASS spinlock_t stack_lock
#ifdef GLOBAL_PTHREAD_PRIVATE
= _SPINLOCK_INITIALIZER
#endif
;
#define STACK_LOCK _SPINLOCK(&stack_lock);
#define STACK_UNLOCK _SPINUNLOCK(&stack_lock);
/* List of all threads: */
SCLASS TAILQ_HEAD(, pthread) _thread_list
#ifdef GLOBAL_PTHREAD_PRIVATE

View File

@ -144,7 +144,7 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
* Use the garbage collector mutex for synchronization of the
* spare stack list.
*/
DEAD_LIST_LOCK;
STACK_LOCK;
if ((spare_stack = LIST_FIRST(&_dstackq)) != NULL) {
/* Use the spare stack. */
@ -153,7 +153,7 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
}
/* Unlock the garbage collector mutex. */
DEAD_LIST_UNLOCK;
STACK_UNLOCK;
}
/*
* The user specified a non-default stack and/or guard size, so try to
@ -165,7 +165,7 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
* Use the garbage collector mutex for synchronization of the
* spare stack list.
*/
DEAD_LIST_LOCK;
STACK_LOCK;
LIST_FOREACH(spare_stack, &_mstackq, qe) {
if (spare_stack->stacksize == stack_size &&
@ -177,7 +177,7 @@ _thread_stack_alloc(size_t stacksize, size_t guardsize)
}
/* Unlock the garbage collector mutex. */
DEAD_LIST_UNLOCK;
STACK_UNLOCK;
}
/* Check if a stack was not allocated from a stack cache: */