summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2013-10-16 01:50:52 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2013-10-16 01:50:52 +0200
commit96623db8d2fe02a66ac9176354634d41aca8c07d (patch)
tree6ce5aea043ce653ef17966563496bd098b37add6
parent5396c1d55933adce68891e000d10ecb8ed168caa (diff)
Delay TLS deallocation outside thread termination
Since libc functions used up to actual thread termination (including the termination RPC itself) are to use TLS. * pthread/pt-alloc.c (initialize_pthread): Set `tcb` field of `new` to NULL. (__pthread_alloc): Deallocate TLS of to-be-reused `new` thread. * pthread/pt-create.c (__pthread_create_internal): Reset `tcb` field to NULL after deallocation. * pthread/pt-exit.c (__pthread_exit): Do not deallocate TLS.
-rw-r--r--pthread/pt-alloc.c13
-rw-r--r--pthread/pt-create.c1
-rw-r--r--pthread/pt-exit.c7
3 files changed, 15 insertions, 6 deletions
diff --git a/pthread/pt-alloc.c b/pthread/pt-alloc.c
index 89fca8a..604d376 100644
--- a/pthread/pt-alloc.c
+++ b/pthread/pt-alloc.c
@@ -75,6 +75,10 @@ initialize_pthread (struct __pthread *new, int recycling)
new->cancelation_handlers = 0;
+#ifdef ENABLE_TLS
+ new->tcb = NULL;
+#endif
+
new->next = 0;
new->prevp = 0;
@@ -119,6 +123,15 @@ __pthread_alloc (struct __pthread **pthread)
cases, we are interrupt it. */
__pthread_thread_halt (new);
+#ifdef ENABLE_TLS
+ if (new->tcb)
+ {
+ /* Drop old values */
+ _dl_deallocate_tls (new->tcb, 1);
+ new->tcb = NULL;
+ }
+#endif /* ENABLE_TLS */
+
err = initialize_pthread (new, 1);
if (! err)
*pthread = new;
diff --git a/pthread/pt-create.c b/pthread/pt-create.c
index a88c498..a593ad0 100644
--- a/pthread/pt-create.c
+++ b/pthread/pt-create.c
@@ -216,6 +216,7 @@ __pthread_create_internal (struct __pthread **thread,
failed_setup:
#ifdef ENABLE_TLS
_dl_deallocate_tls (pthread->tcb, 1);
+ pthread->tcb = NULL;
failed_thread_tls_alloc:
#endif /* ENABLE_TLS */
__pthread_thread_dealloc (pthread);
diff --git a/pthread/pt-exit.c b/pthread/pt-exit.c
index c47b604..8468b80 100644
--- a/pthread/pt-exit.c
+++ b/pthread/pt-exit.c
@@ -69,11 +69,6 @@ __pthread_exit (void *status)
if (self->cancel_state == PTHREAD_CANCEL_ENABLE && self->cancel_pending)
status = PTHREAD_CANCELED;
-#ifdef ENABLE_TLS
- if (self->tcb)
- _dl_deallocate_tls (self->tcb, 1);
-#endif /* ENABLE_TLS */
-
switch (self->state)
{
default:
@@ -85,7 +80,7 @@ __pthread_exit (void *status)
/* Make sure that nobody can reference this thread anymore, and
mark it as terminated. Our thread ID will immediately become
available for re-use. For obvious reasons, we cannot
- deallocate our own stack. However, it will eventually be
+ deallocate our own stack and TLS. However, it will eventually be
reused when this thread structure is recycled. */
__pthread_mutex_unlock (&self->state_lock);