From: Florian Weimer Date: Mon, 10 May 2021 08:31:41 +0000 (+0200) Subject: nptl: Export __libc_multiple_threads from libc as an internal symbol X-Git-Tag: glibc-2.34~471 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=321789f61aa93c14390535aa3cf01846633cd022;p=thirdparty%2Fglibc.git 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 Reviewed-by: Carlos O'Donell --- diff --git a/nptl/Versions b/nptl/Versions index f950b779696..fb15a7e8eb1 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 8aaba088b1c..059786192e2 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 60328023cd3..a0e7932c26e 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 397b83beb65..75f5d28ed69 100644 --- a/nptl/libc_pthread_init.c +++ b/nptl/libc_pthread_init.c @@ -27,20 +27,9 @@ #include #include - -#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 2724770533a..2fb1117f3eb 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -37,11 +37,6 @@ #include #include -#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 6b52ca158e1..dd6d6c6342d 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 060484cdc89..2cab8f0a34d 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 a28aaed04df..841f8c69d58 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)