diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-05-10 10:31:41 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-05-10 10:31:41 +0200 |
commit | 321789f61aa93c14390535aa3cf01846633cd022 (patch) | |
tree | fe2687c3058b23379918e700a7bfec82da2f4cd0 | |
parent | d6163dfd3831cf48b69f430f37b4c099059a9db5 (diff) | |
download | glibc-321789f61aa93c14390535aa3cf01846633cd022.zip glibc-321789f61aa93c14390535aa3cf01846633cd022.tar.gz glibc-321789f61aa93c14390535aa3cf01846633cd022.tar.bz2 |
nptl: Export __libc_multiple_threads from libc as an internal symbol
This allows the elimination of the __libc_multiple_threads_ptr
variable in libpthread and its initialization procedure.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
-rw-r--r-- | nptl/Versions | 1 | ||||
-rw-r--r-- | nptl/allocatestack.c | 4 | ||||
-rw-r--r-- | nptl/libc_multiple_threads.c | 3 | ||||
-rw-r--r-- | nptl/libc_pthread_init.c | 11 | ||||
-rw-r--r-- | nptl/nptl-init.c | 10 | ||||
-rw-r--r-- | nptl/pthreadP.h | 6 | ||||
-rw-r--r-- | nptl/pthread_cancel.c | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/single-thread.h | 6 |
8 files changed, 13 insertions, 30 deletions
diff --git a/nptl/Versions b/nptl/Versions index f950b77..fb15a7e 100644 --- a/nptl/Versions +++ b/nptl/Versions @@ -305,6 +305,7 @@ libc { __libc_cleanup_pop_restore; __libc_cleanup_push_defer; __libc_dl_error_tsd; + __libc_multiple_threads; __libc_pthread_init; __lll_clocklock_elision; __lll_lock_elision; diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 8aaba08..0597861 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -477,7 +477,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, /* This is at least the second thread. */ pd->header.multiple_threads = 1; #ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; + __pthread_multiple_threads = __libc_multiple_threads = 1; #endif #ifdef NEED_DL_SYSINFO @@ -598,7 +598,7 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, /* This is at least the second thread. */ pd->header.multiple_threads = 1; #ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; + __pthread_multiple_threads = __libc_multiple_threads = 1; #endif #ifdef NEED_DL_SYSINFO diff --git a/nptl/libc_multiple_threads.c b/nptl/libc_multiple_threads.c index 6032802..a0e7932 100644 --- a/nptl/libc_multiple_threads.c +++ b/nptl/libc_multiple_threads.c @@ -23,6 +23,7 @@ /* Variable set to a nonzero value either if more than one thread runs or ran, or if a single-threaded process is trying to cancel itself. See nptl/descr.h for more context on the single-threaded process case. */ -int __libc_multiple_threads attribute_hidden; +int __libc_multiple_threads __attribute__ ((nocommon)); +libc_hidden_data_def (__libc_multiple_threads) # endif #endif diff --git a/nptl/libc_pthread_init.c b/nptl/libc_pthread_init.c index 397b83b..75f5d28 100644 --- a/nptl/libc_pthread_init.c +++ b/nptl/libc_pthread_init.c @@ -27,20 +27,9 @@ #include <sysdep.h> #include <ldsodefs.h> - -#ifdef TLS_MULTIPLE_THREADS_IN_TCB void -#else -extern int __libc_multiple_threads attribute_hidden; - -int * -#endif __libc_pthread_init (void (*reclaim) (void)) { /* Called by a child after fork. */ __register_atfork (NULL, NULL, reclaim, NULL); - -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - return &__libc_multiple_threads; -#endif } diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index 2724770..2fb1117 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -37,11 +37,6 @@ #include <libc-pointer-arith.h> #include <pthread_mutex_conf.h> -#ifndef TLS_MULTIPLE_THREADS_IN_TCB -/* Pointer to the corresponding variable in libc. */ -int *__libc_multiple_threads_ptr attribute_hidden; -#endif - /* Size and alignment of static TLS block. */ size_t __static_tls_size; size_t __static_tls_align_m1; @@ -183,10 +178,7 @@ __pthread_initialize_minimal_internal (void) #endif /* Register the fork generation counter with the libc. */ -#ifndef TLS_MULTIPLE_THREADS_IN_TCB - __libc_multiple_threads_ptr = -#endif - __libc_pthread_init (__reclaim_stacks); + __libc_pthread_init (__reclaim_stacks); } strong_alias (__pthread_initialize_minimal_internal, __pthread_initialize_minimal) diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h index 6b52ca1..dd6d6c6 100644 --- a/nptl/pthreadP.h +++ b/nptl/pthreadP.h @@ -368,17 +368,13 @@ extern unsigned long int __fork_generation attribute_hidden; extern unsigned long int *__fork_generation_pointer attribute_hidden; /* Register the generation counter in the libpthread with the libc. */ -#ifdef TLS_MULTIPLE_THREADS_IN_TCB extern void __libc_pthread_init (void (*reclaim) (void)); -#else -extern int *__libc_pthread_init (void (*reclaim) (void)); +#ifndef TLS_MULTIPLE_THREADS_IN_TCB /* Variable set to a nonzero value either if more than one thread runs or ran, or if a single-threaded process is trying to cancel itself. See nptl/descr.h for more context on the single-threaded process case. */ extern int __pthread_multiple_threads attribute_hidden; -/* Pointer to the corresponding variable in libc. */ -extern int *__libc_multiple_threads_ptr attribute_hidden; #endif extern size_t __pthread_get_minstack (const pthread_attr_t *attr); diff --git a/nptl/pthread_cancel.c b/nptl/pthread_cancel.c index 060484c..2cab8f0 100644 --- a/nptl/pthread_cancel.c +++ b/nptl/pthread_cancel.c @@ -90,7 +90,7 @@ __pthread_cancel (pthread_t th) points get executed. */ THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); #ifndef TLS_MULTIPLE_THREADS_IN_TCB - __pthread_multiple_threads = *__libc_multiple_threads_ptr = 1; + __pthread_multiple_threads = __libc_multiple_threads = 1; #endif } /* Mark the thread as canceled. This has to be done diff --git a/sysdeps/unix/sysv/linux/single-thread.h b/sysdeps/unix/sysv/linux/single-thread.h index a28aaed..841f8c6 100644 --- a/sysdeps/unix/sysv/linux/single-thread.h +++ b/sysdeps/unix/sysv/linux/single-thread.h @@ -27,9 +27,13 @@ The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single thread check to use global variables instead of the pthread_t field. */ +#ifndef __ASSEMBLER__ +extern int __libc_multiple_threads; +libc_hidden_proto (__libc_multiple_threads) +#endif + #ifdef SINGLE_THREAD_BY_GLOBAL # if IS_IN (libc) -extern int __libc_multiple_threads; # define SINGLE_THREAD_P \ __glibc_likely (__libc_multiple_threads == 0) # elif IS_IN (libpthread) |