[2/3] Linux: Consolidate {RTLD_}SINGLE_THREAD_P definition
Commit Message
Current GLIBC has two ways to implement the single thread optimization
on syscalls to avoid calling the cancellation path: either by using
global variables (__{libc,pthread}_multiple_thread or by accessing
the TCB/pthread_t field (defined by TLS_MULTIPLE_THREADS_IN_TCB).
Both the variables and the macros to accessing its values are defined
in the architecture sysdep-cancel.h.
This patch consolidates its definition on only one header,
sysdeps/unix/sysv/linux/sysdep-cancel.h, and adds a new define,
SINGLE_THREAD_BY_GLOBAL, which the architecture defines if it
prefer to use the global variables instead of the TCP/pthread_t
field. This is an optimization, so it the architecture does
not define it TCB/pthread_t method will be used (and that's why
I have decided not to use two defines so default sysdep-cancel.h
could warn if one is not defined).
Checked on x86_64-linux-gnu and on a build with major touched
ABis (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf,
hppa-linux-gnu, i686-linux-gnu, m68k-linux-gnu, microblaze-linux-gnu,
mips-linux-gnu, mips64-linux-gnu, powerpc-linux-gnu,
powerpc64le-linux-gnu, s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu,
sparcv9-linux-gnu, sparc64-linux-gnu, tilegx-linux-gnu).
This is based on my "Remove sysdep-cancel assembly macro" patchset [1].
* sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h: Remove file.
* sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/tile/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise.
* sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
(SINGLE_THREAD_BY_GLOBAL): Define.
* sysdeps/unix/sysv/linux/aarch64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
Likewise.
* sysdeps/unix/sysv/linux/alpha/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
Likewise.
* sysdeps/unix/sysv/linux/arm/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
Likewise.
* sysdeps/unix/sysv/linux/hppa/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
Likewise.
* sysdeps/unix/sysv/linux/microblaze/sysdep.h
(SINGLE_THREAD_BY_GLOBAL): Likewise.
* sysdeps/unix/sysv/linux/x86_64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
Likewise.
[1] https://sourceware.org/ml/libc-alpha/2017-08/msg00095.html
---
ChangeLog | 28 ++++++++++
sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h | 52 ------------------
sysdeps/unix/sysv/linux/aarch64/sysdep.h | 2 +
sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h | 48 -----------------
sysdeps/unix/sysv/linux/alpha/sysdep.h | 2 +
sysdeps/unix/sysv/linux/arm/sysdep-cancel.h | 51 ------------------
sysdeps/unix/sysv/linux/arm/sysdep.h | 2 +
sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h | 50 -----------------
sysdeps/unix/sysv/linux/hppa/sysdep.h | 2 +
sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 39 --------------
sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h | 34 ------------
sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 37 -------------
sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 49 -----------------
sysdeps/unix/sysv/linux/microblaze/sysdep.h | 2 +
sysdeps/unix/sysv/linux/mips/sysdep-cancel.h | 38 -------------
sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h | 38 -------------
sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h | 37 -------------
.../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 39 --------------
.../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 52 ------------------
sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 2 +
sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 38 -------------
sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 37 -------------
sysdeps/unix/sysv/linux/sysdep-cancel.h | 62 ++++++++++++++++++++++
sysdeps/unix/sysv/linux/tile/sysdep-cancel.h | 38 -------------
sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h | 54 -------------------
sysdeps/unix/sysv/linux/x86_64/sysdep.h | 2 +
26 files changed, 104 insertions(+), 731 deletions(-)
delete mode 100644 sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
create mode 100644 sysdeps/unix/sysv/linux/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
delete mode 100644 sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
Comments
On 08/07/2017 11:11 PM, Adhemerval Zanella wrote:
> * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
Is this correct? Should it be guarded by IS_IN (libc)?
Thanks,
Florian
On 08/08/2017 03:18, Florian Weimer wrote:
> On 08/07/2017 11:11 PM, Adhemerval Zanella wrote:
>> * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
>> Likewise.
>
> Is this correct? Should it be guarded by IS_IN (libc)?
>
> Thanks,
> Florian
>
SINGLE_THREAD_BY_GLOBAL is already used guarded with IS_IN (libc)
for the cases where the code is build on both libc and libpthread:
nptl/libc_multiple_threads.c:21:#if IS_IN (libc) && defined (SINGLE_THREAD_BY_GLOBAL)
nptl/vars.c:38:#if IS_IN (libpthread) && defined (SINGLE_THREAD_BY_GLOBAL)
Ping.
On 07/08/2017 18:11, Adhemerval Zanella wrote:
> Current GLIBC has two ways to implement the single thread optimization
> on syscalls to avoid calling the cancellation path: either by using
> global variables (__{libc,pthread}_multiple_thread or by accessing
> the TCB/pthread_t field (defined by TLS_MULTIPLE_THREADS_IN_TCB).
> Both the variables and the macros to accessing its values are defined
> in the architecture sysdep-cancel.h.
>
> This patch consolidates its definition on only one header,
> sysdeps/unix/sysv/linux/sysdep-cancel.h, and adds a new define,
> SINGLE_THREAD_BY_GLOBAL, which the architecture defines if it
> prefer to use the global variables instead of the TCP/pthread_t
> field. This is an optimization, so it the architecture does
> not define it TCB/pthread_t method will be used (and that's why
> I have decided not to use two defines so default sysdep-cancel.h
> could warn if one is not defined).
>
> Checked on x86_64-linux-gnu and on a build with major touched
> ABis (aarch64-linux-gnu, alpha-linux-gnu, arm-linux-gnueabihf,
> hppa-linux-gnu, i686-linux-gnu, m68k-linux-gnu, microblaze-linux-gnu,
> mips-linux-gnu, mips64-linux-gnu, powerpc-linux-gnu,
> powerpc64le-linux-gnu, s390-linux-gnu, s390x-linux-gnu, sh4-linux-gnu,
> sparcv9-linux-gnu, sparc64-linux-gnu, tilegx-linux-gnu).
>
> This is based on my "Remove sysdep-cancel assembly macro" patchset [1].
>
> * sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h: Remove file.
> * sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/arm/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/mips/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/tile/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise.
> * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> (SINGLE_THREAD_BY_GLOBAL): Define.
> * sysdeps/unix/sysv/linux/aarch64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
> * sysdeps/unix/sysv/linux/alpha/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
> * sysdeps/unix/sysv/linux/arm/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
> * sysdeps/unix/sysv/linux/hppa/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
> * sysdeps/unix/sysv/linux/microblaze/sysdep.h
> (SINGLE_THREAD_BY_GLOBAL): Likewise.
> * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
> Likewise.
>
> [1] https://sourceware.org/ml/libc-alpha/2017-08/msg00095.html
>
> ---
> ChangeLog | 28 ++++++++++
> sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h | 52 ------------------
> sysdeps/unix/sysv/linux/aarch64/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h | 48 -----------------
> sysdeps/unix/sysv/linux/alpha/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/arm/sysdep-cancel.h | 51 ------------------
> sysdeps/unix/sysv/linux/arm/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h | 50 -----------------
> sysdeps/unix/sysv/linux/hppa/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/i386/sysdep-cancel.h | 39 --------------
> sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h | 34 ------------
> sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h | 37 -------------
> sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h | 49 -----------------
> sysdeps/unix/sysv/linux/microblaze/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/mips/sysdep-cancel.h | 38 -------------
> sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h | 38 -------------
> sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h | 37 -------------
> .../unix/sysv/linux/s390/s390-32/sysdep-cancel.h | 39 --------------
> .../unix/sysv/linux/s390/s390-64/sysdep-cancel.h | 52 ------------------
> sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 2 +
> sysdeps/unix/sysv/linux/sh/sysdep-cancel.h | 38 -------------
> sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h | 37 -------------
> sysdeps/unix/sysv/linux/sysdep-cancel.h | 62 ++++++++++++++++++++++
> sysdeps/unix/sysv/linux/tile/sysdep-cancel.h | 38 -------------
> sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h | 54 -------------------
> sysdeps/unix/sysv/linux/x86_64/sysdep.h | 2 +
> 26 files changed, 104 insertions(+), 731 deletions(-)
> delete mode 100644 sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
> create mode 100644 sysdeps/unix/sysv/linux/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> delete mode 100644 sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
>
> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> deleted file mode 100644
> index 2299526..0000000
> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,52 +0,0 @@
> -/* Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -/* There is no __local_multiple_threads for librt, so use the TCB. */
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# endif
> -
> -#else
> -
> -/* For rtld, et cetera. */
> -# define SINGLE_THREAD_P 1
> -
> -#endif
> -
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> index 4bb9112..c92a480 100644
> --- a/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/aarch64/sysdep.h
> @@ -161,6 +161,8 @@
> which lead in a non existent __send symbol in libc.so. */
> # undef HAVE_INTERNAL_SEND_SYMBOL
>
> +# define SINGLE_THREAD_BY_GLOBAL 1
> +
> /* Define a macro which expands into the inline wrapper code for a system
> call. */
> # undef INLINE_SYSCALL
> diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h b/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> deleted file mode 100644
> index e7d080d..0000000
> --- a/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h
> +++ /dev/null
> @@ -1,48 +0,0 @@
> -/* Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> - __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# endif
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -# define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/alpha/sysdep.h b/sysdeps/unix/sysv/linux/alpha/sysdep.h
> index 4dc2d46..5f4c20e 100644
> --- a/sysdeps/unix/sysv/linux/alpha/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/alpha/sysdep.h
> @@ -70,6 +70,8 @@
> # define __NR_pwrite __NR_pwrite64
> #endif
>
> +#define SINGLE_THREAD_BY_GLOBAL 1
> +
> /*
> * In order to get the hidden arguments for rt_sigaction set up
> * properly, we need to call the assembly version. This shouldn't
> diff --git a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h b/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> deleted file mode 100644
> index 3e6840e..0000000
> --- a/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h
> +++ /dev/null
> @@ -1,51 +0,0 @@
> -/* Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -/* There is no __local_multiple_threads for librt, so use the TCB. */
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# endif
> -
> -#else
> -
> -/* For rtld, et cetera. */
> -# define SINGLE_THREAD_P 1
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h
> index 3ca2198..6a64351 100644
> --- a/sysdeps/unix/sysv/linux/arm/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h
> @@ -437,6 +437,8 @@ __local_syscall_error: \
> #define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
> INTERNAL_SYSCALL_RAW (number, err, nr, args)
>
> +#define SINGLE_THREAD_BY_GLOBAL 1
> +
> #endif /* __ASSEMBLER__ */
>
> #endif /* linux/arm/sysdep.h */
> diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h b/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> deleted file mode 100644
> index d5966d9..0000000
> --- a/sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h
> +++ /dev/null
> @@ -1,50 +0,0 @@
> -/* Copyright (C) 2005-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# define __local_multiple_threads __librt_multiple_threads
> -# else
> -# error Unsupported library
> -# endif
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -/* This code should never be used but we define it anyhow. */
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -/* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h
> index c0cd59e..7163ae4 100644
> --- a/sysdeps/unix/sysv/linux/hppa/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h
> @@ -504,4 +504,6 @@ 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 */
> diff --git a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> deleted file mode 100644
> index 42ec62f..0000000
> --- a/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h
> +++ /dev/null
> @@ -1,39 +0,0 @@
> -/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> deleted file mode 100644
> index 02117ad..0000000
> --- a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
> -#else
> -# define SINGLE_THREAD_P (1)
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> deleted file mode 100644
> index b91451d..0000000
> --- a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -/* Copyright (C) 2010-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Maxim Kuvyrkov <maxim@codesourcery.com>, 2010.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, \
> - 1)
> diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> deleted file mode 100644
> index ec32745..0000000
> --- a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
> +++ /dev/null
> @@ -1,49 +0,0 @@
> -/* Copyright (C) 2014-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# endif
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep.h b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> index 1fbbc55..7bf5a4e 100644
> --- a/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep.h
> @@ -308,6 +308,8 @@ SYSCALL_ERROR_LABEL_DCL: \
> # define PTR_MANGLE(var) (void) (var)
> # define PTR_DEMANGLE(var) (void) (var)
>
> +# define SINGLE_THREAD_BY_GLOBAL 1
> +
> #endif /* not __ASSEMBLER__ */
>
> #endif /* _LINUX_MICROBLAZE_SYSDEP_H */
> diff --git a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h b/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> deleted file mode 100644
> index f40a86d..0000000
> --- a/sysdeps/unix/sysv/linux/mips/sysdep-cancel.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/* Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <sysdeps/generic/sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) \
> - == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P 1
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> deleted file mode 100644
> index b84365a..0000000
> --- a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/* Assembler macros with cancellation support, Nios II version.
> - Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) \
> - == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P 1
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> deleted file mode 100644
> index 23dbbbd..0000000
> --- a/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -/* Cancellable system call stubs. Linux/PowerPC version.
> - Copyright (C) 2015 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> deleted file mode 100644
> index a6ff391..0000000
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h
> +++ /dev/null
> @@ -1,39 +0,0 @@
> -/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> deleted file mode 100644
> index e54a696..0000000
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,52 +0,0 @@
> -/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> - __builtin_expect (__local_multiple_threads == 0, 1)
> -
> -# else
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -# endif
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> index e22d9b6..622991d 100644
> --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
> @@ -291,6 +291,8 @@
> #define HAVE_GETTIMEOFDAY_VSYSCALL 1
> #define HAVE_GETCPU_VSYSCALL 1
>
> +#define SINGLE_THREAD_BY_GLOBAL 1
> +
> /* This version is for internal uses when there is no desire
> to set errno */
> #define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...) \
> diff --git a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> deleted file mode 100644
> index 1b8c5d7..0000000
> --- a/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/* Copyright (C) 2003-2017 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
> deleted file mode 100644
> index f3eb49f..0000000
> --- a/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
> +++ /dev/null
> @@ -1,37 +0,0 @@
> -/* Copyright (C) 2002-2015 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h
> new file mode 100644
> index 0000000..821114b
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/sysdep-cancel.h
> @@ -0,0 +1,62 @@
> +/* Single-thread optimization definitions. Linux version.
> + Copyright (C) 2017 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
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <sysdep.h>
> +#include <tls.h>
> +#include <nptl/pthreadP.h>
> +
> +/* The default way to check if process is single thread is using the
> + pthread_t 'multiple_threads' field. However for some architectures
> + it is faster to either use an extra field on TCB or global varibles
> + (the TCB field is basically used on x86 for some atomic optimizations).
> +
> + The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single
> + thread check to use global variables instead of the pthread_t
> + field. */
> +#ifdef SINGLE_THREAD_BY_GLOBAL
> +# if IS_IN (libc)
> +extern int __libc_multiple_threads;
> +# 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
> +# 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
> +
> +#define RTLD_SINGLE_THREAD_P \
> + __glibc_likely (THREAD_GETMEM (THREAD_SELF, \
> + header.multiple_threads) == 0)
> diff --git a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h b/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> deleted file mode 100644
> index fedabfb..0000000
> --- a/sysdeps/unix/sysv/linux/tile/sysdep-cancel.h
> +++ /dev/null
> @@ -1,38 +0,0 @@
> -/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#include <nptl/pthreadP.h>
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) \
> - == 0, 1)
> -
> -#else
> -
> -# define SINGLE_THREAD_P 1
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
> deleted file mode 100644
> index 39f9453..0000000
> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h
> +++ /dev/null
> @@ -1,54 +0,0 @@
> -/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> - Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
> -
> - 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
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <sysdep.h>
> -#include <tls.h>
> -#ifndef __ASSEMBLER__
> -# include <nptl/pthreadP.h>
> -#endif
> -
> -#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
> -
> -# if IS_IN (libpthread)
> -# define __local_multiple_threads __pthread_multiple_threads
> -# elif IS_IN (libc)
> -# define __local_multiple_threads __libc_multiple_threads
> -# elif IS_IN (librt)
> -# else
> -# error Unsupported library
> -# endif
> -
> -# if IS_IN (libpthread) || IS_IN (libc)
> -extern int __local_multiple_threads attribute_hidden;
> -# define SINGLE_THREAD_P \
> - __builtin_expect (__local_multiple_threads == 0, 1)
> -# else
> -# define SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> -# endif
> -
> -#else
> -
> -# define SINGLE_THREAD_P (1)
> -
> -#endif
> -
> -#define RTLD_SINGLE_THREAD_P \
> - __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
> - header.multiple_threads) == 0, 1)
> diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> index f299bf2..ad78dd6 100644
> --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
> @@ -376,6 +376,8 @@
> # define HAVE_GETTIMEOFDAY_VSYSCALL 1
> # define HAVE_GETCPU_VSYSCALL 1
>
> +# define SINGLE_THREAD_BY_GLOBAL 1
> +
> #endif /* __ASSEMBLER__ */
>
>
>
On 08/08/2017 08:59, Adhemerval Zanella wrote:
>
>
> On 08/08/2017 03:18, Florian Weimer wrote:
>> On 08/07/2017 11:11 PM, Adhemerval Zanella wrote:
>>> * sysdeps/unix/sysv/linux/x86_64/sysdep.h (SINGLE_THREAD_BY_GLOBAL):
>>> Likewise.
>>
>> Is this correct? Should it be guarded by IS_IN (libc)?
>>
>> Thanks,
>> Florian
>>
>
> SINGLE_THREAD_BY_GLOBAL is already used guarded with IS_IN (libc)
> for the cases where the code is build on both libc and libpthread:
>
> nptl/libc_multiple_threads.c:21:#if IS_IN (libc) && defined (SINGLE_THREAD_BY_GLOBAL)
> nptl/vars.c:38:#if IS_IN (libpthread) && defined (SINGLE_THREAD_BY_GLOBAL)
>
If noone objects I will commit it.
deleted file mode 100644
@@ -1,52 +0,0 @@
-/* Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-/* There is no __local_multiple_threads for librt, so use the TCB. */
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# endif
-
-#else
-
-/* For rtld, et cetera. */
-# define SINGLE_THREAD_P 1
-
-#endif
-
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -161,6 +161,8 @@
which lead in a non existent __send symbol in libc.so. */
# undef HAVE_INTERNAL_SEND_SYMBOL
+# define SINGLE_THREAD_BY_GLOBAL 1
+
/* Define a macro which expands into the inline wrapper code for a system
call. */
# undef INLINE_SYSCALL
deleted file mode 100644
@@ -1,48 +0,0 @@
-/* Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-# define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -70,6 +70,8 @@
# define __NR_pwrite __NR_pwrite64
#endif
+#define SINGLE_THREAD_BY_GLOBAL 1
+
/*
* In order to get the hidden arguments for rt_sigaction set up
* properly, we need to call the assembly version. This shouldn't
deleted file mode 100644
@@ -1,51 +0,0 @@
-/* Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-/* There is no __local_multiple_threads for librt, so use the TCB. */
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# endif
-
-#else
-
-/* For rtld, et cetera. */
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -437,6 +437,8 @@ __local_syscall_error: \
#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
INTERNAL_SYSCALL_RAW (number, err, nr, args)
+#define SINGLE_THREAD_BY_GLOBAL 1
+
#endif /* __ASSEMBLER__ */
#endif /* linux/arm/sysdep.h */
deleted file mode 100644
@@ -1,50 +0,0 @@
-/* Copyright (C) 2005-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# define __local_multiple_threads __librt_multiple_threads
-# else
-# error Unsupported library
-# endif
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-/* This code should never be used but we define it anyhow. */
-# define SINGLE_THREAD_P (1)
-
-#endif
-/* IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt) */
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -504,4 +504,6 @@ 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 */
deleted file mode 100644
@@ -1,39 +0,0 @@
-/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,34 +0,0 @@
-/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0, 1)
-#else
-# define SINGLE_THREAD_P (1)
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,37 +0,0 @@
-/* Copyright (C) 2010-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Maxim Kuvyrkov <maxim@codesourcery.com>, 2010.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, \
- 1)
deleted file mode 100644
@@ -1,49 +0,0 @@
-/* Copyright (C) 2014-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -308,6 +308,8 @@ SYSCALL_ERROR_LABEL_DCL: \
# define PTR_MANGLE(var) (void) (var)
# define PTR_DEMANGLE(var) (void) (var)
+# define SINGLE_THREAD_BY_GLOBAL 1
+
#endif /* not __ASSEMBLER__ */
#endif /* _LINUX_MICROBLAZE_SYSDEP_H */
deleted file mode 100644
@@ -1,38 +0,0 @@
-/* Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <sysdeps/generic/sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) \
- == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,38 +0,0 @@
-/* Assembler macros with cancellation support, Nios II version.
- Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) \
- == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,37 +0,0 @@
-/* Cancellable system call stubs. Linux/PowerPC version.
- Copyright (C) 2015 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,39 +0,0 @@
-/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,52 +0,0 @@
-/* Copyright (C) 2003-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2003.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-
-# else
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -291,6 +291,8 @@
#define HAVE_GETTIMEOFDAY_VSYSCALL 1
#define HAVE_GETCPU_VSYSCALL 1
+#define SINGLE_THREAD_BY_GLOBAL 1
+
/* This version is for internal uses when there is no desire
to set errno */
#define INTERNAL_VSYSCALL_NO_SYSCALL_FALLBACK(name, err, nr, args...) \
deleted file mode 100644
@@ -1,38 +0,0 @@
-/* Copyright (C) 2003-2017 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,37 +0,0 @@
-/* Copyright (C) 2002-2015 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
new file mode 100644
@@ -0,0 +1,62 @@
+/* Single-thread optimization definitions. Linux version.
+ Copyright (C) 2017 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
+ <http://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+#include <tls.h>
+#include <nptl/pthreadP.h>
+
+/* The default way to check if process is single thread is using the
+ pthread_t 'multiple_threads' field. However for some architectures
+ it is faster to either use an extra field on TCB or global varibles
+ (the TCB field is basically used on x86 for some atomic optimizations).
+
+ The ABI might define SINGLE_THREAD_BY_GLOBAL to enable the single
+ thread check to use global variables instead of the pthread_t
+ field. */
+#ifdef SINGLE_THREAD_BY_GLOBAL
+# if IS_IN (libc)
+extern int __libc_multiple_threads;
+# 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
+# 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
+
+#define RTLD_SINGLE_THREAD_P \
+ __glibc_likely (THREAD_GETMEM (THREAD_SELF, \
+ header.multiple_threads) == 0)
deleted file mode 100644
@@ -1,38 +0,0 @@
-/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#include <nptl/pthreadP.h>
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) \
- == 0, 1)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
deleted file mode 100644
@@ -1,54 +0,0 @@
-/* Copyright (C) 2002-2017 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
- Contributed by Jakub Jelinek <jakub@redhat.com>, 2002.
-
- 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
- <http://www.gnu.org/licenses/>. */
-
-#include <sysdep.h>
-#include <tls.h>
-#ifndef __ASSEMBLER__
-# include <nptl/pthreadP.h>
-#endif
-
-#if IS_IN (libc) || IS_IN (libpthread) || IS_IN (librt)
-
-# if IS_IN (libpthread)
-# define __local_multiple_threads __pthread_multiple_threads
-# elif IS_IN (libc)
-# define __local_multiple_threads __libc_multiple_threads
-# elif IS_IN (librt)
-# else
-# error Unsupported library
-# endif
-
-# if IS_IN (libpthread) || IS_IN (libc)
-extern int __local_multiple_threads attribute_hidden;
-# define SINGLE_THREAD_P \
- __builtin_expect (__local_multiple_threads == 0, 1)
-# else
-# define SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
- __builtin_expect (THREAD_GETMEM (THREAD_SELF, \
- header.multiple_threads) == 0, 1)
@@ -376,6 +376,8 @@
# define HAVE_GETTIMEOFDAY_VSYSCALL 1
# define HAVE_GETCPU_VSYSCALL 1
+# define SINGLE_THREAD_BY_GLOBAL 1
+
#endif /* __ASSEMBLER__ */