summaryrefslogtreecommitdiff
path: root/cleanup.c
diff options
context:
space:
mode:
authorrpj <rpj>1998-10-29 20:58:36 +0000
committerrpj <rpj>1998-10-29 20:58:36 +0000
commite0b68aae21da8697ef0f4f3924ea29edb0e89582 (patch)
treef5fe9666d832692241b88d35da3a9e292102c3a5 /cleanup.c
parente0cb3da9bad150b424848b993bb100766d07ded7 (diff)
Fri Oct 30 15:15:50 1998 Ross Johnson <rpj@swan.canberra.edu.au>
* cleanup.c (_pthread_handler_push): Fixed bug appending new handler to list reported by Peter Slacik <Peter.Slacik@leibinger.freinet.de>. (new_thread): Rename poorly named local variable to "new_handler".
Diffstat (limited to 'cleanup.c')
-rw-r--r--cleanup.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/cleanup.c b/cleanup.c
index 936e6e1..1eac9f3 100644
--- a/cleanup.c
+++ b/cleanup.c
@@ -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++;