summaryrefslogtreecommitdiff
path: root/libpthread/pthread/pt-exit.c
diff options
context:
space:
mode:
authorneal <neal>2008-08-16 09:37:22 +0000
committerneal <neal>2008-08-16 09:37:22 +0000
commit54e51f1330ed2f31fd5b7a7260478880c54d33b7 (patch)
tree02c39cbc99be44bb7da8e44513c143801ebed729 /libpthread/pthread/pt-exit.c
parenta64c5f68c2e5915ac63e3e70216a970bda327c41 (diff)
2008-08-16 Neal H. Walfield <neal@gnu.org>
* pthread/pt-alloc.c: Don't include <atomic.h>. (__pthread_free_threads): Change to a struct __pthread *. (__pthread_free_threads_lock): New variable. (__pthread_alloc): When looking for a TCB to reuse, iterate over __pthread_free_threads taking the first for which the STATE field is PTHREAD_TERMINATED. When reusing a TCB, first call __pthread_thread_halt on it. * pthread/pt-dealloc.c: Don't include <atomic.h>. (__pthread_free_threads): Change to a struct __pthread *. (__pthread_free_threads_lock): New declaration. (__pthread_dealloc): Enqueue PTHREAD on __PTHREAD_FREE_THREADS. Set PTHREAD->STATE to PTHREAD_TERMINATED after everything else. * pthread/pt-join.c (pthread_join): Call __pthread_thread_halt before destroying the thread. When destroying the thread, call __pthread_thread_dealloc on it. * pthread/pt-exit.c (pthread_exit): Call __pthread_dealloc only if the thread is detached and then as the last thing we do before calling __pthread_thread_halt. * pthread/pt-internal.h (__pthread_thread_halt): Remove argument NEED_DEALLOC. Update users. * sysdeps/l4/hurd/pt-thread-halt.c (__pthread_thread_halt): Remove argument need_dealloc. Move the deallocation code from this file... * sysdeps/l4/hurd/pt-thread-dealloc.c: ... to this new file. * sysdeps/l4/hurd/pt-sysdep.h (PTHREAD_SYSDEP_MEMBERS): Add field have_kernel_resources. * sysdeps/l4/hurd/pt-thread-alloc.c (__pthread_thread_alloc): If THREAD->HAVE_KERNEL_RESOURCES is true, just return. After allocating the resources, set THREAD->HAVE_KERNEL_RESOURCES to true.
Diffstat (limited to 'libpthread/pthread/pt-exit.c')
-rw-r--r--libpthread/pthread/pt-exit.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/libpthread/pthread/pt-exit.c b/libpthread/pthread/pt-exit.c
index a8f85b1..68c56d7 100644
--- a/libpthread/pthread/pt-exit.c
+++ b/libpthread/pthread/pt-exit.c
@@ -28,7 +28,7 @@
/* Terminate the current thread and make STATUS available to any
- thread that might join us. */
+ thread that might join it. */
void
pthread_exit (void *status)
{
@@ -70,8 +70,6 @@ pthread_exit (void *status)
if (self->cancel_state == PTHREAD_CANCEL_ENABLE && self->cancel_pending)
status = PTHREAD_CANCELED;
- __pthread_thread_dealloc (self);
-
switch (self->state)
{
default:
@@ -86,7 +84,8 @@ pthread_exit (void *status)
deallocate our own stack. However, it will eventually be
reused when this thread structure is recycled. */
__pthread_mutex_unlock (&self->state_lock);
- need_dealloc = 1;
+
+ __pthread_dealloc (self);
break;
@@ -103,7 +102,6 @@ pthread_exit (void *status)
waiting to join us. */
pthread_cond_broadcast (&self->state_cond);
__pthread_mutex_unlock (&self->state_lock);
- need_dealloc = 0;
break;
}
@@ -113,7 +111,7 @@ pthread_exit (void *status)
This means that before freeing any resources, such a thread
should make sure that this thread is really halted. */
- __pthread_thread_halt (self, need_dealloc);
+ __pthread_thread_halt (self);
/* NOTREACHED */
abort ();