mirror of
https://sourceware.org/git/glibc.git
synced 2025-08-01 10:06:57 +03:00
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.
This commit is contained in:
@ -188,6 +188,9 @@ int (*_dl_make_stack_executable_hook) (void **) = _dl_make_stack_executable;
|
|||||||
/* Function in libpthread to wait for termination of lookups. */
|
/* Function in libpthread to wait for termination of lookups. */
|
||||||
void (*_dl_wait_lookup_done) (void);
|
void (*_dl_wait_lookup_done) (void);
|
||||||
|
|
||||||
|
#if !THREAD_GSCOPE_IN_TCB
|
||||||
|
int _dl_thread_gscope_count;
|
||||||
|
#endif
|
||||||
struct dl_scope_free_list *_dl_scope_free_list;
|
struct dl_scope_free_list *_dl_scope_free_list;
|
||||||
|
|
||||||
#ifdef NEED_DL_SYSINFO
|
#ifdef NEED_DL_SYSINFO
|
||||||
|
@ -109,6 +109,7 @@ typedef struct
|
|||||||
descr->member[idx] = (value)
|
descr->member[idx] = (value)
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
# define THREAD_GSCOPE_IN_TCB 1
|
||||||
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
# define THREAD_GSCOPE_FLAG_USED 1
|
# define THREAD_GSCOPE_FLAG_USED 1
|
||||||
# define THREAD_GSCOPE_FLAG_WAIT 2
|
# define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -103,6 +103,7 @@ typedef struct
|
|||||||
descr->member[idx] = (value)
|
descr->member[idx] = (value)
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -100,6 +100,7 @@ typedef struct
|
|||||||
descr->member[idx] = (value)
|
descr->member[idx] = (value)
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -435,6 +435,9 @@ struct rtld_global
|
|||||||
size_t count;
|
size_t count;
|
||||||
void *list[50];
|
void *list[50];
|
||||||
} *_dl_scope_free_list;
|
} *_dl_scope_free_list;
|
||||||
|
#if !THREAD_GSCOPE_IN_TCB
|
||||||
|
EXTERN int _dl_thread_gscope_count;
|
||||||
|
#endif
|
||||||
#ifdef SHARED
|
#ifdef SHARED
|
||||||
};
|
};
|
||||||
# define __rtld_global_attribute__
|
# define __rtld_global_attribute__
|
||||||
|
@ -71,4 +71,10 @@
|
|||||||
This macro returns the address of the DTV of the current thread.
|
This macro returns the address of the DTV of the current thread.
|
||||||
This normally is done using the thread register which points
|
This normally is done using the thread register which points
|
||||||
to the dtv or the TCB (from which the DTV can found).
|
to the dtv or the TCB (from which the DTV can found).
|
||||||
|
|
||||||
|
|
||||||
|
THREAD_GSCOPE_IN_TCB
|
||||||
|
|
||||||
|
This should be set to 1 if the global scope flag is stored within the TCB.
|
||||||
|
When set to 0, GL(_dl_thread_gscope_count) will be defined to store it.
|
||||||
*/
|
*/
|
||||||
|
@ -134,6 +134,7 @@ static inline void __set_cr27(struct pthread *cr27)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -411,6 +411,7 @@ tls_fill_user_desc (union user_desc_init *desc,
|
|||||||
|
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in the TCB head. */
|
/* Get and set the global scope generation counter in the TCB head. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -155,6 +155,7 @@ register struct pthread *__thread_self __asm__("r13");
|
|||||||
= THREAD_GET_POINTER_GUARD ())
|
= THREAD_GET_POINTER_GUARD ())
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -134,6 +134,7 @@ extern void * __m68k_read_tp (void);
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
# include <sysdep.h>
|
# include <sysdep.h>
|
||||||
# include <mach/mig_errors.h>
|
# include <mach/mig_errors.h>
|
||||||
# include <mach.h>
|
# include <mach.h>
|
||||||
|
# include <atomic.h>
|
||||||
|
|
||||||
|
|
||||||
/* This is the size of the initial TCB. */
|
/* This is the size of the initial TCB. */
|
||||||
@ -51,6 +52,26 @@
|
|||||||
# define GET_DTV(descr) \
|
# define GET_DTV(descr) \
|
||||||
(((tcbhead_t *) (descr))->dtv)
|
(((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 */
|
#endif /* !ASSEMBLER */
|
||||||
|
|
||||||
|
|
||||||
|
@ -116,6 +116,7 @@ typedef struct
|
|||||||
(descr->member[idx] = (value))
|
(descr->member[idx] = (value))
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
# define THREAD_GSCOPE_IN_TCB 1
|
||||||
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
# define THREAD_GSCOPE_FLAG_USED 1
|
# define THREAD_GSCOPE_FLAG_USED 1
|
||||||
# define THREAD_GSCOPE_FLAG_WAIT 2
|
# define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -159,6 +159,7 @@ typedef struct
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -137,6 +137,7 @@ register struct pthread *__thread_self __asm__("r23");
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -236,6 +236,7 @@ register void *__thread_register __asm__ ("r13");
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -118,6 +118,7 @@ typedef struct
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
# define THREAD_GSCOPE_IN_TCB 1
|
||||||
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
# define THREAD_GSCOPE_FLAG_USED 1
|
# define THREAD_GSCOPE_FLAG_USED 1
|
||||||
# define THREAD_GSCOPE_FLAG_WAIT 2
|
# define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -169,6 +169,7 @@ typedef struct
|
|||||||
#define THREAD_COPY_POINTER_GUARD(descr)
|
#define THREAD_COPY_POINTER_GUARD(descr)
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -141,6 +141,7 @@ typedef struct
|
|||||||
((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;})
|
((tcbhead_t *) (descr + 1))->pointer_guard = __tcbp->pointer_guard;})
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -141,6 +141,7 @@ register struct pthread *__thread_self __asm__("%g7");
|
|||||||
((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ())
|
((descr)->header.pointer_guard = THREAD_GET_POINTER_GUARD ())
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -157,6 +157,7 @@ register void *__thread_pointer asm ("tp");
|
|||||||
# define NO_TLS_OFFSET -1
|
# define NO_TLS_OFFSET -1
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in struct pthread. */
|
/* Get and set the global scope generation counter in struct pthread. */
|
||||||
|
#define THREAD_GSCOPE_IN_TCB 1
|
||||||
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
#define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
#define THREAD_GSCOPE_FLAG_USED 1
|
#define THREAD_GSCOPE_FLAG_USED 1
|
||||||
#define THREAD_GSCOPE_FLAG_WAIT 2
|
#define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
@ -343,6 +343,7 @@ typedef struct
|
|||||||
|
|
||||||
|
|
||||||
/* Get and set the global scope generation counter in the TCB head. */
|
/* Get and set the global scope generation counter in the TCB head. */
|
||||||
|
# define THREAD_GSCOPE_IN_TCB 1
|
||||||
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
# define THREAD_GSCOPE_FLAG_UNUSED 0
|
||||||
# define THREAD_GSCOPE_FLAG_USED 1
|
# define THREAD_GSCOPE_FLAG_USED 1
|
||||||
# define THREAD_GSCOPE_FLAG_WAIT 2
|
# define THREAD_GSCOPE_FLAG_WAIT 2
|
||||||
|
Reference in New Issue
Block a user