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:
parent
3440accd67
commit
23f7669444
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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: */
|
||||
|
Loading…
Reference in New Issue
Block a user