aboutsummaryrefslogtreecommitdiff
path: root/nptl/pthread_create.c
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2021-04-21 19:49:50 +0200
committerFlorian Weimer <fweimer@redhat.com>2021-04-21 19:49:50 +0200
commit2cfef0b042561ec2a61cab0a1f3a85a28780985d (patch)
tree3f1cc7d083b28a3a71a5668cce4cc80c6b4506f8 /nptl/pthread_create.c
parenta91bf4e0ff4df92553e72f181ae1f60e1b36503c (diff)
downloadglibc-2cfef0b042561ec2a61cab0a1f3a85a28780985d.zip
glibc-2cfef0b042561ec2a61cab0a1f3a85a28780985d.tar.gz
glibc-2cfef0b042561ec2a61cab0a1f3a85a28780985d.tar.bz2
nptl: Move __nptl_deallocate_tsd into libc
This prepares moving pthread_exit, and later the pthread_key_create infrastructure. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'nptl/pthread_create.c')
-rw-r--r--nptl/pthread_create.c94
1 files changed, 0 insertions, 94 deletions
diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c
index c1c5b24..7fc8c7a 100644
--- a/nptl/pthread_create.c
+++ b/nptl/pthread_create.c
@@ -250,100 +250,6 @@ __find_in_stack_list (struct pthread *pd)
}
-/* Deallocate POSIX thread-local-storage. */
-void
-attribute_hidden
-__nptl_deallocate_tsd (void)
-{
- struct pthread *self = THREAD_SELF;
-
- /* Maybe no data was ever allocated. This happens often so we have
- a flag for this. */
- if (THREAD_GETMEM (self, specific_used))
- {
- size_t round;
- size_t cnt;
-
- round = 0;
- do
- {
- size_t idx;
-
- /* So far no new nonzero data entry. */
- THREAD_SETMEM (self, specific_used, false);
-
- for (cnt = idx = 0; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt)
- {
- struct pthread_key_data *level2;
-
- level2 = THREAD_GETMEM_NC (self, specific, cnt);
-
- if (level2 != NULL)
- {
- size_t inner;
-
- for (inner = 0; inner < PTHREAD_KEY_2NDLEVEL_SIZE;
- ++inner, ++idx)
- {
- void *data = level2[inner].data;
-
- if (data != NULL)
- {
- /* Always clear the data. */
- level2[inner].data = NULL;
-
- /* Make sure the data corresponds to a valid
- key. This test fails if the key was
- deallocated and also if it was
- re-allocated. It is the user's
- responsibility to free the memory in this
- case. */
- if (level2[inner].seq
- == __pthread_keys[idx].seq
- /* It is not necessary to register a destructor
- function. */
- && __pthread_keys[idx].destr != NULL)
- /* Call the user-provided destructor. */
- __pthread_keys[idx].destr (data);
- }
- }
- }
- else
- idx += PTHREAD_KEY_1STLEVEL_SIZE;
- }
-
- if (THREAD_GETMEM (self, specific_used) == 0)
- /* No data has been modified. */
- goto just_free;
- }
- /* We only repeat the process a fixed number of times. */
- while (__builtin_expect (++round < PTHREAD_DESTRUCTOR_ITERATIONS, 0));
-
- /* Just clear the memory of the first block for reuse. */
- memset (&THREAD_SELF->specific_1stblock, '\0',
- sizeof (self->specific_1stblock));
-
- just_free:
- /* Free the memory for the other blocks. */
- for (cnt = 1; cnt < PTHREAD_KEY_1STLEVEL_SIZE; ++cnt)
- {
- struct pthread_key_data *level2;
-
- level2 = THREAD_GETMEM_NC (self, specific, cnt);
- if (level2 != NULL)
- {
- /* The first block is allocated as part of the thread
- descriptor. */
- free (level2);
- THREAD_SETMEM_NC (self, specific, cnt, NULL);
- }
- }
-
- THREAD_SETMEM (self, specific_used, false);
- }
-}
-
-
/* Deallocate a thread's stack after optionally making sure the thread
descriptor is still valid. */
void