aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--elf/dl-tls.c49
-rw-r--r--nptl/allocatestack.c3
-rw-r--r--sysdeps/generic/ldsodefs.h6
-rw-r--r--sysdeps/unix/sysv/linux/dl-sysdep.c2
-rw-r--r--sysdeps/unix/sysv/linux/dl-sysdep.h4
5 files changed, 9 insertions, 55 deletions
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index 7770ec3..5659adb 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -535,11 +535,10 @@ _dl_allocate_tls (void *mem)
rtld_hidden_def (_dl_allocate_tls)
void
-internal_function
_dl_clear_dtv (dtv_t *dtv)
{
for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
- if (! dtv[1 + cnt].pointer.is_static
+ if (/*! dtv[1 + cnt].pointer.is_static */ 1
&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
__signal_safe_free (dtv[1 + cnt].pointer.val);
memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
@@ -746,7 +745,6 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
the_map = listp->slotinfo[idx].map;
}
-#if 0
sigset_t old;
_dl_mask_all_signals (&old);
@@ -754,7 +752,6 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
reentrancy. */
if (dtv[GET_ADDR_MODULE].pointer.val != TLS_DTV_UNALLOCATED)
{
- assert (dtv[GET_ADDR_MODULE].pointer.val != TLS_DTV_UNALLOCATED);
_dl_unmask_signals (&old);
return (char *) dtv[GET_ADDR_MODULE].pointer.val + GET_ADDR_OFFSET;
@@ -778,48 +775,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
offset = the_map->l_tls_offset;
assert (offset != NO_TLS_OFFSET);
}
- #endif
-
- /* Make sure that, if a dlopen running in parallel forces the
- variable into static storage, we'll wait until the address in the
- static TLS block is set up, and use that. If we're undecided
- yet, make sure we make the decision holding the lock as well. */
- if (__glibc_unlikely (the_map->l_tls_offset
- != FORCED_DYNAMIC_TLS_OFFSET))
- {
- __rtld_lock_lock_recursive (GL(dl_load_lock));
- if (__glibc_likely (the_map->l_tls_offset == NO_TLS_OFFSET))
- {
- the_map->l_tls_offset = FORCED_DYNAMIC_TLS_OFFSET;
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
- else if (__glibc_likely (the_map->l_tls_offset
- != FORCED_DYNAMIC_TLS_OFFSET))
- {
-#if TLS_TCB_AT_TP
- void *p = (char *) THREAD_SELF - the_map->l_tls_offset;
-#elif TLS_DTV_AT_TP
- void *p = (char *) THREAD_SELF + the_map->l_tls_offset + TLS_PRE_TCB_SIZE;
-#else
-# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
-#endif
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
-
- dtv[GET_ADDR_MODULE].pointer.to_free = NULL;
- dtv[GET_ADDR_MODULE].pointer.val = p;
- return (char *) p + GET_ADDR_OFFSET;
- }
- else
- __rtld_lock_unlock_recursive (GL(dl_load_lock));
- }
- struct dtv_pointer result = allocate_and_init (the_map);
- dtv[GET_ADDR_MODULE].pointer = result;
- assert (result.to_free != NULL);
-
- return (char *) result.val + GET_ADDR_OFFSET;
-
-#if 0
if (offset == FORCED_DYNAMIC_TLS_OFFSET)
{
allocate_and_init (&dtv[GET_ADDR_MODULE], the_map);
@@ -835,7 +791,7 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
threads to initialize it. They'll eventually write
to pointer.val, at which point we know they've fully
completed initialization. */
- atomic_delay ();
+ atomic_spin_nop ();
}
/* Make sure we've picked up their initialization of the actual
block; this pairs against the write barrier in
@@ -847,7 +803,6 @@ tls_get_addr_tail (GET_ADDR_ARGS, dtv_t *dtv, struct link_map *the_map)
_dl_unmask_signals (&old);
return (char *) dtv[GET_ADDR_MODULE].pointer.val + GET_ADDR_OFFSET;
-#endif
}
diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c
index 3757656..49bfc66 100644
--- a/nptl/allocatestack.c
+++ b/nptl/allocatestack.c
@@ -1243,6 +1243,7 @@ init_one_static_tls (struct pthread *curp, struct link_map *map)
memset (__mempcpy (dest, map->l_tls_initimage, map->l_tls_initimage_size),
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
+#if 0 /* still needed? dtv refs gone in current code */
/* Fill in the DTV slot so that a later LD/GD access will find it. */
dtv[map->l_tls_modid].pointer.is_static = true;
/* Pairs against the read barrier in tls_get_attr_tail, guaranteeing
@@ -1250,7 +1251,7 @@ init_one_static_tls (struct pthread *curp, struct link_map *map)
initimage write. */
atomic_write_barrier ();
dtv[map->l_tls_modid].pointer.val = dest;
-
+#endif
}
void
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 7326e11..a582230 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -258,9 +258,9 @@ extern unsigned long int _dl_higher_prime_number (unsigned long int n)
uint64_t _dl_strtoul (const char *, char **) attribute_hidden;
/* Mask every signal, returning the previous sigmask in OLD. */
-extern void _dl_mask_all_signals (sigset_t *old) internal_function;
+extern void _dl_mask_all_signals (sigset_t *old);
/* Undo _dl_mask_all_signals. */
-extern void _dl_unmask_signals (sigset_t *old) internal_function;
+extern void _dl_unmask_signals (sigset_t *old);
/* Function used as argument for `_dl_receive_error' function. The
arguments are the error code, error string, and the objname the
@@ -1103,7 +1103,7 @@ rtld_hidden_proto (_dl_allocate_tls_init)
/* Remove all allocated dynamic TLS regions from a DTV
for reuse by new thread. */
-extern void _dl_clear_dtv (dtv_t *dtv) internal_function;
+extern void _dl_clear_dtv (dtv_t *dtv);
rtld_hidden_proto (_dl_clear_dtv)
extern void *__signal_safe_memalign (size_t boundary, size_t size);
diff --git a/sysdeps/unix/sysv/linux/dl-sysdep.c b/sysdeps/unix/sysv/linux/dl-sysdep.c
index f8d1d5d..18fe7f3 100644
--- a/sysdeps/unix/sysv/linux/dl-sysdep.c
+++ b/sysdeps/unix/sysv/linux/dl-sysdep.c
@@ -134,7 +134,6 @@ _dl_discover_osversion (void)
/* Mask every signal, returning the previous sigmask in OLD. */
void
-internal_function
_dl_mask_all_signals (sigset_t *old)
{
int ret;
@@ -165,7 +164,6 @@ _dl_mask_all_signals (sigset_t *old)
/* Return sigmask to what it was before a call to _dl_mask_all_signals. */
void
-internal_function
_dl_unmask_signals (sigset_t *old)
{
int ret;
diff --git a/sysdeps/unix/sysv/linux/dl-sysdep.h b/sysdeps/unix/sysv/linux/dl-sysdep.h
index 0c64545..4c09321 100644
--- a/sysdeps/unix/sysv/linux/dl-sysdep.h
+++ b/sysdeps/unix/sysv/linux/dl-sysdep.h
@@ -32,6 +32,6 @@ extern int _dl_discover_osversion (void) attribute_hidden;
# define HAVE_DL_DISCOVER_OSVERSION 1
#include <signal.h>
-void _dl_mask_all_signals (sigset_t *) internal_function;
-void _dl_unmask_all_signals (sigset_t *) internal_function;
+void _dl_mask_all_signals (sigset_t *);
+void _dl_unmask_all_signals (sigset_t *);
#endif