mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-27 03:41:23 +08:00
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 \
|
||||
futex-internal \
|
||||
libc-cleanup \
|
||||
libc_multiple_threads \
|
||||
lowlevellock \
|
||||
nptl-stack \
|
||||
nptl_deallocate_tsd \
|
||||
|
@ -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);
|
||||
|
@ -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. */
|
||||
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,
|
||||
|
@ -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);
|
||||
|
@ -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; \
|
||||
|
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_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
|
||||
|
||||
# define SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
# undef INTERNAL_SYSCALL_RAW
|
||||
# define INTERNAL_SYSCALL_RAW(name, nr, args...) \
|
||||
({ long _sys_result; \
|
||||
|
@ -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>
|
||||
|
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__ */
|
||||
|
||||
# define SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
# if IS_IN (libc)
|
||||
extern long int __syscall_error (long int);
|
||||
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...) \
|
||||
INTERNAL_SYSCALL_RAW (number, nr, args)
|
||||
|
||||
#define SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#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_DEMANGLE(var) (void) (var)
|
||||
|
||||
#define SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
#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_DEMANGLE(var) (void) (var)
|
||||
|
||||
# define SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
#undef HAVE_INTERNAL_BRK_ADDR_SYMBOL
|
||||
#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_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
|
||||
|
||||
|
@ -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
|
||||
|
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 SINGLE_THREAD_BY_GLOBAL 1
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user