aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/mach
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2018-03-04 19:11:26 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2018-03-11 13:06:33 +0100
commita5df0318ef30a4dcff3fa2cb82265f641813d9ea (patch)
tree68dac2abbbf7703f55aa067cdc19e06e98babe83 /sysdeps/mach
parent0d13dfa17b3bdf4f5ccc179869917cc65f009e7a (diff)
downloadglibc-a5df0318ef30a4dcff3fa2cb82265f641813d9ea.tar
glibc-a5df0318ef30a4dcff3fa2cb82265f641813d9ea.tar.gz
glibc-a5df0318ef30a4dcff3fa2cb82265f641813d9ea.tar.bz2
glibc-a5df0318ef30a4dcff3fa2cb82265f641813d9ea.zip
hurd: add gscope support
* elf/dl-support.c [!THREAD_GSCOPE_IN_TCB] (_dl_thread_gscope_count): Define variable. * sysdeps/generic/ldsodefs.h [!THREAD_GSCOPE_IN_TCB] (struct rtld_global): Add _dl_thread_gscope_count member. * sysdeps/mach/hurd/tls.h: Include <atomic.h>. [!defined __ASSEMBLER__] (THREAD_GSCOPE_GLOBAL, THREAD_GSCOPE_SET_FLAG, THREAD_GSCOPE_RESET_FLAG, THREAD_GSCOPE_WAIT): Define macros. * sysdeps/generic/tls.h: Document THREAD_GSCOPE_IN_TCB. * sysdeps/aarch64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/alpha/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/arm/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/hppa/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/i386/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/ia64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/m68k/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/microblaze/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/mips/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/nios2/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/powerpc/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/riscv/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/s390/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/sh/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/sparc/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/tile/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1. * sysdeps/x86_64/nptl/tls.h: Define THREAD_GSCOPE_IN_TCB to 1.
Diffstat (limited to 'sysdeps/mach')
-rw-r--r--sysdeps/mach/hurd/tls.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/sysdeps/mach/hurd/tls.h b/sysdeps/mach/hurd/tls.h
index faff87c7b5..67c657b655 100644
--- a/sysdeps/mach/hurd/tls.h
+++ b/sysdeps/mach/hurd/tls.h
@@ -27,6 +27,7 @@
# include <sysdep.h>
# include <mach/mig_errors.h>
# include <mach.h>
+# include <atomic.h>
/* This is the size of the initial TCB. */
@@ -51,6 +52,26 @@
# define GET_DTV(descr) \
(((tcbhead_t *) (descr))->dtv)
+/* Global scope switch support. */
+#define THREAD_GSCOPE_IN_TCB 0
+#define THREAD_GSCOPE_GLOBAL
+#define THREAD_GSCOPE_SET_FLAG() \
+ atomic_exchange_and_add_acq (&GL(dl_thread_gscope_count), 1)
+#define THREAD_GSCOPE_RESET_FLAG() \
+ do \
+ if (atomic_exchange_and_add_rel (&GL(dl_thread_gscope_count), -1) == 1) \
+ lll_wake (&GL(dl_thread_gscope_count), 0); \
+ while (0)
+#define THREAD_GSCOPE_WAIT() \
+ do \
+ { \
+ int count; \
+ atomic_write_barrier (); \
+ while ((count = GL(dl_thread_gscope_count))) \
+ lll_wait (&GL(dl_thread_gscope_count), count, 0); \
+ } \
+ while (0)
+
#endif /* !ASSEMBLER */