Linux: Consolidate {RTLD_}SINGLE_THREAD_P definition
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Thu, 3 Aug 2017 22:27:27 +0000 (19:27 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 11 Oct 2017 17:27:24 +0000 (14:27 -0300)
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 field (defined by TLS_MULTIPLE_THREADS_IN_TCB).  Both the
variables and the macros to acces its value are defined in the
architecture sysdep-cancel.h header.

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 TCB field.  This is an
optimization, so if the architecture does not define it, the TCB
method will be used as default.

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).

* 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.

26 files changed:
ChangeLog
sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/aarch64/sysdep.h
sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/alpha/sysdep.h
sysdeps/unix/sysv/linux/arm/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/arm/sysdep.h
sysdeps/unix/sysv/linux/hppa/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/hppa/sysdep.h
sysdeps/unix/sysv/linux/i386/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/microblaze/sysdep.h
sysdeps/unix/sysv/linux/mips/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h
sysdeps/unix/sysv/linux/sh/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/sysdep-cancel.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/tile/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h [deleted file]
sysdeps/unix/sysv/linux/x86_64/sysdep.h

index 1a89064..3a1dba9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2017-10-11  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+
+       * 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.
+
 2017-10-11  Andreas Schwab  <schwab@suse.de>
 
        * nis/Makefile (aux): Remove.
diff --git a/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/aarch64/sysdep-cancel.h
deleted file mode 100644 (file)
index 27741a3..0000000
+++ /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 __glibc_likely (__local_multiple_threads == 0)
-# else
-/*  There is no __local_multiple_threads for librt, so use the TCB.  */
-#  define SINGLE_THREAD_P                                              \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-# endif
-
-#else
-
-/* For rtld, et cetera.  */
-# define SINGLE_THREAD_P 1
-
-#endif
-
-# define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index 4bb9112..c92a480 100644 (file)
    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 (file)
index 561cb67..0000000
+++ /dev/null
@@ -1,46 +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 \
-  __glibc_likely (__local_multiple_threads == 0)
-# else
-#  define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-# define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index 4dc2d46..5f4c20e 100644 (file)
@@ -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 (file)
index b227187..0000000
+++ /dev/null
@@ -1,47 +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 __glibc_likely (__local_multiple_threads == 0)
-# else
-/*  There is no __local_multiple_threads for librt, so use the TCB.  */
-#  define SINGLE_THREAD_P                                              \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-# endif
-
-#else
-
-/* For rtld, et cetera.  */
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index 3ca2198..6a64351 100644 (file)
@@ -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 (file)
index 8a85fc2..0000000
+++ /dev/null
@@ -1,46 +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>
-#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
-# elif IS_IN (librt)
-#  define __local_multiple_threads __librt_multiple_threads
-# else
-#  error Unsupported library
-# endif
-
-# define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#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 \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index c0cd59e..7163ae4 100644 (file)
@@ -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 (file)
index 5c11983..0000000
+++ /dev/null
@@ -1,35 +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>
-#include <nptl/pthreadP.h>
-
-#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
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h
deleted file mode 100644 (file)
index fe5b35a..0000000
+++ /dev/null
@@ -1,31 +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>
-#include <nptl/pthreadP.h>
-
-#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
-# define SINGLE_THREAD_P (1)
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h b/sysdeps/unix/sysv/linux/m68k/sysdep-cancel.h
deleted file mode 100644 (file)
index b192a68..0000000
+++ /dev/null
@@ -1,34 +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                                               \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P                                     \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h b/sysdeps/unix/sysv/linux/microblaze/sysdep-cancel.h
deleted file mode 100644 (file)
index 120ea06..0000000
+++ /dev/null
@@ -1,45 +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>
-#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 __glibc_likely (__local_multiple_threads == 0)
-# else
-#  define SINGLE_THREAD_P                                           \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P                                        \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index 1fbbc55..7bf5a4e 100644 (file)
@@ -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 (file)
index 31dbba0..0000000
+++ /dev/null
@@ -1,35 +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                                               \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h b/sysdeps/unix/sysv/linux/nios2/sysdep-cancel.h
deleted file mode 100644 (file)
index 4e7f536..0000000
+++ /dev/null
@@ -1,35 +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                                               \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/powerpc/sysdep-cancel.h
deleted file mode 100644 (file)
index 59f752f..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Cancellable system call stubs.  Linux/PowerPC 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>
-
-#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
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
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 (file)
index bd606d5..0000000
+++ /dev/null
@@ -1,35 +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)
-
-# define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
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 (file)
index 2283b86..0000000
+++ /dev/null
@@ -1,50 +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 \
-  __glibc_likely (__local_multiple_threads == 0)
-
-# else
-
-#  define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index e22d9b6..622991d 100644 (file)
 #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 (file)
index b2deb11..0000000
+++ /dev/null
@@ -1,34 +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)
-
-# define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sparc/sysdep-cancel.h
deleted file mode 100644 (file)
index 7fe0dee..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Cancellable system call stubs.  Linux/Sparc 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>
-
-#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
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
diff --git a/sysdeps/unix/sysv/linux/sysdep-cancel.h b/sysdeps/unix/sysv/linux/sysdep-cancel.h
new file mode 100644 (file)
index 0000000..57bd093
--- /dev/null
@@ -0,0 +1,64 @@
+/* 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 the process is single thread is by using the
+   pthread_t 'multiple_threads' field.  However for some architectures it
+   is faster to either use an extra field on TCB or global varibles
+   (the TCB field is also used on x86 for some single-thread 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 /* SINGLE_THREAD_BY_GLOBAL  */
+# 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 /* SINGLE_THREAD_BY_GLOBAL  */
+
+#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 (file)
index a606b0c..0000000
+++ /dev/null
@@ -1,35 +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                                               \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-
-#else
-
-# define SINGLE_THREAD_P 1
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P                                           \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
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 (file)
index 34f14c6..0000000
+++ /dev/null
@@ -1,50 +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>
-#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
-# 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 \
-  __glibc_likely (__local_multiple_threads == 0)
-# else
-#  define SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
-# endif
-
-#else
-
-# define SINGLE_THREAD_P (1)
-
-#endif
-
-#define RTLD_SINGLE_THREAD_P \
-  __glibc_likely (THREAD_GETMEM (THREAD_SELF, header.multiple_threads) == 0)
index f299bf2..ad78dd6 100644 (file)
 # define HAVE_GETTIMEOFDAY_VSYSCALL     1
 # define HAVE_GETCPU_VSYSCALL          1
 
+# define SINGLE_THREAD_BY_GLOBAL               1
+
 #endif /* __ASSEMBLER__ */