[05/13] Linux: Simplify and fix the definition of SINGLE_THREAD_P

Message ID c6656da0ca95243eaae4bfc5988ba6a14fb211e4.1620323953.git.fweimer@redhat.com
State Committed
Commit 29d4d1be681fee2fa7cf23205b6d993a3b2a4566
Headers
Series Linux: Move most stack management out of libpthread |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Florian Weimer May 6, 2021, 6:10 p.m. UTC
  Always use __libc_multiple_threads if beneficial, and do not assume
the the dynamic loader is single-threaded.  This assumption could
become incorrect by accident once more code is moved from libpthread
into it.  The previous commit introducing the
NO_SYSCALL_CANCEL_CHECKING macro enables this change.

Do not hint to the compiler that multi-threaded programs are unlikely
(which is not quite true anymore).
---
 sysdeps/unix/sysv/linux/single-thread.h | 36 +++++--------------------
 1 file changed, 7 insertions(+), 29 deletions(-)
  

Comments

Carlos O'Donell May 9, 2021, 9:42 p.m. UTC | #1
On 5/6/21 2:10 PM, Florian Weimer via Libc-alpha wrote:
> Always use __libc_multiple_threads if beneficial, and do not assume
> the the dynamic loader is single-threaded.  This assumption could
> become incorrect by accident once more code is moved from libpthread
> into it.  The previous commit introducing the
> NO_SYSCALL_CANCEL_CHECKING macro enables this change.
> 
> Do not hint to the compiler that multi-threaded programs are unlikely
> (which is not quite true anymore).

LGTM.

Tested on x86_64 and i686 without regression.

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>

> ---
>  sysdeps/unix/sysv/linux/single-thread.h | 36 +++++--------------------
>  1 file changed, 7 insertions(+), 29 deletions(-)
> 
> diff --git a/sysdeps/unix/sysv/linux/single-thread.h b/sysdeps/unix/sysv/linux/single-thread.h
> index 841f8c69d5..2fac8dcc11 100644
> --- a/sysdeps/unix/sysv/linux/single-thread.h
> +++ b/sysdeps/unix/sysv/linux/single-thread.h
> @@ -32,35 +32,13 @@ extern int __libc_multiple_threads;
>  libc_hidden_proto (__libc_multiple_threads)
>  #endif
>  
> -#ifdef SINGLE_THREAD_BY_GLOBAL
> -# if IS_IN (libc)
> -#  define SINGLE_THREAD_P \
> -  __glibc_likely (__libc_multiple_threads == 0)
> -# elif IS_IN (libpthread)
> -extern int __pthread_multiple_threads;
> -#  define SINGLE_THREAD_P \
> -  __glibc_likely (__pthread_multiple_threads == 0)
> -# elif IS_IN (librt)
> -#   define SINGLE_THREAD_P					\
> -  __glibc_likely (THREAD_GETMEM (THREAD_SELF,			\
> -				 header.multiple_threads) == 0)
> -# else
> -/* For rtld, et cetera.  */
> -#  define SINGLE_THREAD_P (1)
> -# endif
> -#else /* SINGLE_THREAD_BY_GLOBAL  */
> -# if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -#   define SINGLE_THREAD_P					\
> -  __glibc_likely (THREAD_GETMEM (THREAD_SELF,			\
> -				 header.multiple_threads) == 0)
> -# else
> -/* For rtld, et cetera.  */
> -#  define SINGLE_THREAD_P (1)
> -# endif
> -#endif /* SINGLE_THREAD_BY_GLOBAL  */
> +#if !defined SINGLE_THREAD_BY_GLOBAL || IS_IN (rtld)
> +# define SINGLE_THREAD_P \
> +  (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
> +#else
> +# define SINGLE_THREAD_P (__libc_multiple_threads == 0)
> +#endif
>  
> -#define RTLD_SINGLE_THREAD_P \
> -  __glibc_likely (THREAD_GETMEM (THREAD_SELF, \
> -				 header.multiple_threads) == 0)
> +#define RTLD_SINGLE_THREAD_P SINGLE_THREAD_P
>  
>  #endif /* _SINGLE_THREAD_H  */
>
  

Patch

diff --git a/sysdeps/unix/sysv/linux/single-thread.h b/sysdeps/unix/sysv/linux/single-thread.h
index 841f8c69d5..2fac8dcc11 100644
--- a/sysdeps/unix/sysv/linux/single-thread.h
+++ b/sysdeps/unix/sysv/linux/single-thread.h
@@ -32,35 +32,13 @@  extern int __libc_multiple_threads;
 libc_hidden_proto (__libc_multiple_threads)
 #endif
 
-#ifdef SINGLE_THREAD_BY_GLOBAL
-# if IS_IN (libc)
-#  define SINGLE_THREAD_P \
-  __glibc_likely (__libc_multiple_threads == 0)
-# elif IS_IN (libpthread)
-extern int __pthread_multiple_threads;
-#  define SINGLE_THREAD_P \
-  __glibc_likely (__pthread_multiple_threads == 0)
-# elif IS_IN (librt)
-#   define SINGLE_THREAD_P					\
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF,			\
-				 header.multiple_threads) == 0)
-# else
-/* For rtld, et cetera.  */
-#  define SINGLE_THREAD_P (1)
-# endif
-#else /* SINGLE_THREAD_BY_GLOBAL  */
-# if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-#   define SINGLE_THREAD_P					\
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF,			\
-				 header.multiple_threads) == 0)
-# else
-/* For rtld, et cetera.  */
-#  define SINGLE_THREAD_P (1)
-# endif
-#endif /* SINGLE_THREAD_BY_GLOBAL  */
+#if !defined SINGLE_THREAD_BY_GLOBAL || IS_IN (rtld)
+# define SINGLE_THREAD_P \
+  (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
+#else
+# define SINGLE_THREAD_P (__libc_multiple_threads == 0)
+#endif
 
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, \
-				 header.multiple_threads) == 0)
+#define RTLD_SINGLE_THREAD_P SINGLE_THREAD_P
 
 #endif /* _SINGLE_THREAD_H  */