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 \
futex-internal \
libc-cleanup \
libc_multiple_threads \
lowlevellock \
nptl-stack \
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. */
pd->header.multiple_threads = 1;
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1;
#endif
#ifdef NEED_DL_SYSINFO
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. */
pd->header.multiple_threads = 1;
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1;
#endif
#ifdef NEED_DL_SYSINFO
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. */
THREAD_SETMEM (THREAD_SELF, header.multiple_threads, 1);
#ifndef TLS_MULTIPLE_THREADS_IN_TCB
__libc_multiple_threads = 1;
__libc_single_threaded_internal = 0;
#endif
}
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
best effort to make is async-signal-safe at least for single-thread
case. */
bool multiple_threads = __libc_single_threaded_internal == 0;
bool multiple_threads = !SINGLE_THREAD_P;
uint64_t lastrun;
lastrun = __run_prefork_handlers (multiple_threads);

View File

@ -29,7 +29,7 @@
#define INLINE_SETXID_SYSCALL(name, nr, args...) \
({ \
int __result; \
if (!__libc_single_threaded_internal) \
if (!SINGLE_THREAD_P) \
{ \
struct xid_command __cmd; \
__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_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
# define SINGLE_THREAD_BY_GLOBAL 1
# undef INTERNAL_SYSCALL_RAW
# define INTERNAL_SYSCALL_RAW(name, nr, args...) \
({ long _sys_result; \

View File

@ -32,8 +32,6 @@
#undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name
#define SINGLE_THREAD_BY_GLOBAL 1
#ifdef __ASSEMBLER__
#include <asm/pal.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__ */
# define SINGLE_THREAD_BY_GLOBAL 1
# if IS_IN (libc)
extern long int __syscall_error (long int);
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...) \
INTERNAL_SYSCALL_RAW (number, nr, args)
#define SINGLE_THREAD_BY_GLOBAL 1
#endif /* __ASSEMBLER__ */
#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_DEMANGLE(var) (void) (var)
#define SINGLE_THREAD_BY_GLOBAL 1
#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_DEMANGLE(var) (void) (var)
# define SINGLE_THREAD_BY_GLOBAL 1
#undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
#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_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_HASH 123718585

View File

@ -19,6 +19,10 @@
#ifndef _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
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
@ -27,16 +31,11 @@
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
#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)
# define SINGLE_THREAD_P (__libc_single_threaded_internal != 0)
#endif
#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 SINGLE_THREAD_BY_GLOBAL 1
#endif /* __ASSEMBLER__ */