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:
parent
af1aa36c61
commit
e070501d12
|
@ -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 \
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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; \
|
||||||
|
|
2
sysdeps/unix/sysv/linux/aarch64/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/aarch64/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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; \
|
||||||
|
|
|
@ -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>
|
||||||
|
|
2
sysdeps/unix/sysv/linux/arc/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/arc/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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)
|
||||||
|
|
2
sysdeps/unix/sysv/linux/arm/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/arm/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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 */
|
||||||
|
|
2
sysdeps/unix/sysv/linux/hppa/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/hppa/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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 */
|
||||||
|
|
2
sysdeps/unix/sysv/linux/microblaze/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/microblaze/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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
|
||||||
|
|
||||||
|
|
2
sysdeps/unix/sysv/linux/s390/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/s390/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
2
sysdeps/unix/sysv/linux/x86_64/single-thread.h
Normal file
2
sysdeps/unix/sysv/linux/x86_64/single-thread.h
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#define SINGLE_THREAD_BY_GLOBAL
|
||||||
|
#include_next <single-thread.h>
|
|
@ -379,8 +379,6 @@
|
||||||
|
|
||||||
# define HAVE_CLONE3_WRAPPER 1
|
# define HAVE_CLONE3_WRAPPER 1
|
||||||
|
|
||||||
# define SINGLE_THREAD_BY_GLOBAL 1
|
|
||||||
|
|
||||||
#endif /* __ASSEMBLER__ */
|
#endif /* __ASSEMBLER__ */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue