Replace __libc_multiple_threads with __libc_single_threaded

And also fixes the SINGLE_THREAD_P macro for SINGLE_THREAD_BY_GLOBAL,
since header inclusion single-thread.h is in the wrong order, the define
needs to come before including sysdeps/unix/sysdep.h.  The macro
is now moved to a per-arch single-threade.h header.

The SINGLE_THREAD_P is used on some more places.

Checked on aarch64-linux-gnu and x86_64-linux-gnu.
This commit is contained in:
Adhemerval Zanella 2022-06-07 13:09:40 -03:00
parent af1aa36c61
commit e070501d12
22 changed files with 22 additions and 61 deletions

View file

@ -50,7 +50,6 @@ routines = \
events \ events \
futex-internal \ futex-internal \
libc-cleanup \ libc-cleanup \
libc_multiple_threads \
lowlevellock \ lowlevellock \
nptl-stack \ nptl-stack \
nptl_deallocate_tsd \ nptl_deallocate_tsd \

View file

@ -292,9 +292,6 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
/* This is at least the second thread. */ /* This is at least the second thread. */
pd->header.multiple_threads = 1; pd->header.multiple_threads = 1;
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1;
#endif
#ifdef NEED_DL_SYSINFO #ifdef NEED_DL_SYSINFO
SETUP_THREAD_SYSINFO (pd); SETUP_THREAD_SYSINFO (pd);
@ -413,9 +410,6 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
/* This is at least the second thread. */ /* This is at least the second thread. */
pd->header.multiple_threads = 1; pd->header.multiple_threads = 1;
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1;
#endif
#ifdef NEED_DL_SYSINFO #ifdef NEED_DL_SYSINFO
SETUP_THREAD_SYSINFO (pd); SETUP_THREAD_SYSINFO (pd);

View file

@ -1,28 +0,0 @@
/* Copyright (C) 2002-2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
#include <pthreadP.h>
#if IS_IN (libc)
# 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. */
int __libc_multiple_threads;
libc_hidden_data_def (__libc_multiple_threads)
# endif
#endif

View file

@ -161,7 +161,7 @@ __pthread_cancel (pthread_t th)
points get executed. */ points get executed. */
THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1); THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
#ifndef TLS_MULTIPLE_THREADS_IN_TCB #ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1; __libc_single_threaded_internal = 0;
#endif #endif
} }
while (!atomic_compare_exchange_weak_acquire (&pd->cancelhandling, &oldval, while (!atomic_compare_exchange_weak_acquire (&pd->cancelhandling, &oldval,

View file

@ -45,7 +45,7 @@ __libc_fork (void)
requirement for fork (Austin Group tracker issue #62) this is requirement for fork (Austin Group tracker issue #62) this is
best effort to make is async-signal-safe at least for single-thread best effort to make is async-signal-safe at least for single-thread
case. */ case. */
bool multiple_threads = __libc_single_threaded_internal == 0; bool multiple_threads = !SINGLE_THREAD_P;
uint64_t lastrun; uint64_t lastrun;
lastrun = __run_prefork_handlers (multiple_threads); lastrun = __run_prefork_handlers (multiple_threads);

View file

@ -29,7 +29,7 @@
#define INLINE_SETXID_SYSCALL(name, nr, args...) \ #define INLINE_SETXID_SYSCALL(name, nr, args...) \
({ \ ({ \
int __result; \ int __result; \
if (!__libc_single_threaded_internal) \ if (!SINGLE_THREAD_P) \
{ \ { \
struct xid_command __cmd; \ struct xid_command __cmd; \
__cmd.syscall_no = __NR_##name; \ __cmd.syscall_no = __NR_##name; \

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -164,8 +164,6 @@
# define HAVE_CLOCK_GETTIME64_VSYSCALL "__kernel_clock_gettime" # define HAVE_CLOCK_GETTIME64_VSYSCALL "__kernel_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday" # define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
# define SINGLE_THREAD_BY_GLOBAL 1
# undef INTERNAL_SYSCALL_RAW # undef INTERNAL_SYSCALL_RAW
# define INTERNAL_SYSCALL_RAW(name, nr, args...) \ # define INTERNAL_SYSCALL_RAW(name, nr, args...) \
({ long _sys_result; \ ({ long _sys_result; \

View file

@ -32,8 +32,6 @@
#undef SYS_ify #undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name #define SYS_ify(syscall_name) __NR_##syscall_name
#define SINGLE_THREAD_BY_GLOBAL 1
#ifdef __ASSEMBLER__ #ifdef __ASSEMBLER__
#include <asm/pal.h> #include <asm/pal.h>
#include <alpha/regdef.h> #include <alpha/regdef.h>

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -132,8 +132,6 @@ L (call_syscall_err): ASM_LINE_SEP \
#else /* !__ASSEMBLER__ */ #else /* !__ASSEMBLER__ */
# define SINGLE_THREAD_BY_GLOBAL 1
# if IS_IN (libc) # if IS_IN (libc)
extern long int __syscall_error (long int); extern long int __syscall_error (long int);
hidden_proto (__syscall_error) hidden_proto (__syscall_error)

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -408,8 +408,6 @@ __local_syscall_error: \
#define INTERNAL_SYSCALL_NCS(number, nr, args...) \ #define INTERNAL_SYSCALL_NCS(number, nr, args...) \
INTERNAL_SYSCALL_RAW (number, nr, args) INTERNAL_SYSCALL_RAW (number, nr, args)
#define SINGLE_THREAD_BY_GLOBAL 1
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */
#endif /* linux/arm/sysdep.h */ #endif /* linux/arm/sysdep.h */

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -474,6 +474,4 @@ L(pre_end): ASM_LINE_SEP \
#define PTR_MANGLE(var) (void) (var) #define PTR_MANGLE(var) (void) (var)
#define PTR_DEMANGLE(var) (void) (var) #define PTR_DEMANGLE(var) (void) (var)
#define SINGLE_THREAD_BY_GLOBAL 1
#endif /* _LINUX_HPPA_SYSDEP_H */ #endif /* _LINUX_HPPA_SYSDEP_H */

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -308,8 +308,6 @@ SYSCALL_ERROR_LABEL_DCL: \
# define PTR_MANGLE(var) (void) (var) # define PTR_MANGLE(var) (void) (var)
# define PTR_DEMANGLE(var) (void) (var) # define PTR_DEMANGLE(var) (void) (var)
# define SINGLE_THREAD_BY_GLOBAL 1
#undef HAVE_INTERNAL_BRK_ADDR_SYMBOL #undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
#define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1 #define HAVE_INTERNAL_BRK_ADDR_SYMBOL 1

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -93,9 +93,6 @@
#define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6) #define ASMFMT_5 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6)
#define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7) #define ASMFMT_6 , "0" (gpr2), "d" (gpr3), "d" (gpr4), "d" (gpr5), "d" (gpr6), "d" (gpr7)
#define SINGLE_THREAD_BY_GLOBAL 1
#define VDSO_NAME "LINUX_2.6.29" #define VDSO_NAME "LINUX_2.6.29"
#define VDSO_HASH 123718585 #define VDSO_HASH 123718585

View file

@ -19,6 +19,10 @@
#ifndef _SINGLE_THREAD_H #ifndef _SINGLE_THREAD_H
#define _SINGLE_THREAD_H #define _SINGLE_THREAD_H
#ifndef __ASSEMBLER__
# include <sys/single_threaded.h>
#endif
/* The default way to check if the process is single thread is by using the /* The default way to check if the process is single thread is by using the
pthread_t 'multiple_threads' field. However, for some architectures it is pthread_t 'multiple_threads' field. However, for some architectures it is
faster to either use an extra field on TCB or global variables (the TCB faster to either use an extra field on TCB or global variables (the TCB
@ -27,16 +31,11 @@
The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single thread The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single thread
check to use global variables instead of the pthread_t field. */ 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
#if !defined SINGLE_THREAD_BY_GLOBAL || IS_IN (rtld) #if !defined SINGLE_THREAD_BY_GLOBAL || IS_IN (rtld)
# define SINGLE_THREAD_P \ # define SINGLE_THREAD_P \
(THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0) (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
#else #else
# define SINGLE_THREAD_P (__libc_multiple_threads == 0) # define SINGLE_THREAD_P (__libc_single_threaded_internal != 0)
#endif #endif
#define RTLD_SINGLE_THREAD_P SINGLE_THREAD_P #define RTLD_SINGLE_THREAD_P SINGLE_THREAD_P

View file

@ -0,0 +1,2 @@
#define SINGLE_THREAD_BY_GLOBAL
#include_next <single-thread.h>

View file

@ -379,8 +379,6 @@
# define HAVE_CLONE3_WRAPPER 1 # define HAVE_CLONE3_WRAPPER 1
# define SINGLE_THREAD_BY_GLOBAL 1
#endif /* __ASSEMBLER__ */ #endif /* __ASSEMBLER__ */