Linux: Simplify and fix the definition of SINGLE_THREAD_P

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).

Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
Florian Weimer 2021-05-10 10:31:41 +02:00
parent 1c75f89613
commit 29d4d1be68

View File

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