diff options
Diffstat (limited to 'cleanup.c')
-rw-r--r-- | cleanup.c | 40 |
1 files changed, 22 insertions, 18 deletions
@@ -20,48 +20,48 @@ _pthread_handler_push(int stack, { /* Place the new handler into the list so that handlers are popped off in the order given by poporder. */ - _pthread_handler_node_t * new_thread; + _pthread_handler_node_t * new_handler; _pthread_handler_node_t * next; _pthread_handler_node_t ** stacktop; stacktop = _PTHREAD_STACK(stack); - new_thread = + new_handler = (_pthread_handler_node_t *) malloc(sizeof(_pthread_handler_node_t)); - if (new_thread == NULL) + if (new_handler == NULL) { return 0; /* NOMEM */ } - new_thread->routine = routine; - new_thread->arg = arg; + new_handler->routine = routine; + new_handler->arg = arg; if (poporder == _PTHREAD_HANDLER_POP_LIFO) { /* Add the new node to the start of the list. */ - new_thread->next = *stacktop; - *stacktop = next; + new_handler->next = *stacktop; + *stacktop = new_handler; } else { /* Add the new node to the end of the list. */ - new_thread->next = NULL; + new_handler->next = NULL; if (*stacktop == NULL) { - *stacktop = new_thread; + *stacktop = new_handler; } else { next = *stacktop; - while (next != NULL) + while (next->next != NULL) { next = next->next; } - next = new_thread; + next->next = new_handler; } } return 0; @@ -126,7 +126,6 @@ void _pthread_destructor_run_all() { _pthread_tsd_key_t * key; - void * arg; int count; /* This threads private keys */ @@ -134,6 +133,8 @@ _pthread_destructor_run_all() /* Stop destructor execution at a finite time. POSIX allows us to ignore this if we like, even at the risk of an infinite loop. + + FIXME: We don't know when to stop yet. */ for (count = 0; count < PTHREAD_DESTRUCTOR_ITERATIONS; count++) { @@ -142,14 +143,17 @@ _pthread_destructor_run_all() /* Loop through all keys. */ for (k = 0; k < _POSIX_THREAD_KEYS_MAX; k++) { - if (key->in_use != _PTHREAD_TSD_KEY_INUSE) - continue; + /* If there's no destructor or the key isn't in use, skip it. */ + if (key->destructor != NULL && key->in_use == _PTHREAD_TSD_KEY_INUSE) + { + void * arg; - arg = pthread_getspecific((pthread_key_t) k); + arg = pthread_getspecific((pthread_key_t) k); - if (arg != NULL && key->destructor != NULL) - { - (void) (key->destructor)(arg); + if (arg != NULL) + { + (void) (key->destructor)(arg); + } } key++; |