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

Message ID c6656da0ca95243eaae4bfc5988ba6a14fb211e4.1620323953.git.fweimer@redhat.com
State New
Headers show
Series
  • Linux: Move most stack management out of libpthread
Related show

Commit Message

Mark Brown via Libc-alpha May 6, 2021, 6:10 p.m.
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(-)

-- 
2.30.2

Comments

Mark Brown via Libc-alpha May 9, 2021, 9:42 p.m. | #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  */

> 



-- 
Cheers,
Carlos.

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  */