[2/3] Linux: Consolidate {RTLD_}SINGLE_THREAD_P definition

Message ID 1502140314-16598-2-git-send-email-adhemerval.zanella@linaro.org
State New
Headers show
Series
  • [1/3] Remove NO_CANCELLATION macro
Related show

Commit Message

Adhemerval Zanella Aug. 7, 2017, 9:11 p.m.
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

-- 
2.7.4

Comments

Florian Weimer Aug. 8, 2017, 6:18 a.m. | #1
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
Adhemerval Zanella Aug. 8, 2017, 11:59 a.m. | #2
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)
Adhemerval Zanella Aug. 31, 2017, 7:17 p.m. | #3
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__ */

>  

>  

>
Adhemerval Zanella Oct. 10, 2017, 8:39 p.m. | #4
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.

Patch

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__ */