about summary refs log tree commit diff
path: root/elf/dl-tls.c
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2014-02-05 21:19:51 +1000
committerAllan McRae <allan@archlinux.org>2014-02-06 08:46:20 +1000
commitdd654bf9ba1848bf9ed250f8ebaa5097c383dcf8 (patch)
tree5161c5c706a08004747386293562ad1d93e815e1 /elf/dl-tls.c
parent73d61e4f6c65da714c0f8a3a233725322553ceba (diff)
downloadglibc-dd654bf9ba1848bf9ed250f8ebaa5097c383dcf8.tar.gz
glibc-dd654bf9ba1848bf9ed250f8ebaa5097c383dcf8.tar.xz
glibc-dd654bf9ba1848bf9ed250f8ebaa5097c383dcf8.zip
Revert "Patch 2/4 of the effort to make TLS access async-signal-safe."
This reverts commit 1f33d36a8a9e78c81bed59b47f260723f56bb7e6.

Conflicts:
	elf/dl-misc.c

Also reverts the follow commits that were bug fixes to new code introduced
in the above commit:
063b2acbce83549df82ab30f5af573f1b9c4bd19
b627fdd58554bc36bd344dc40a8787c4b7a9cc46
e81c64bba13d2d8b2a4e53254a82cc80f27c8497
Diffstat (limited to 'elf/dl-tls.c')
-rw-r--r--elf/dl-tls.c34
1 files changed, 16 insertions, 18 deletions
diff --git a/elf/dl-tls.c b/elf/dl-tls.c
index c1802e7d4e..28e4fbef40 100644
--- a/elf/dl-tls.c
+++ b/elf/dl-tls.c
@@ -293,7 +293,7 @@ allocate_dtv (void *result)
      initial set of modules.  This should avoid in most cases expansions
      of the dtv.  */
   dtv_length = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
-  dtv = __signal_safe_calloc (dtv_length + 2, sizeof (dtv_t));
+  dtv = calloc (dtv_length + 2, sizeof (dtv_t));
   if (dtv != NULL)
     {
       /* This is the initial length of the dtv.  */
@@ -470,7 +470,7 @@ _dl_clear_dtv (dtv_t *dtv)
   for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
     if (! dtv[1 + cnt].pointer.is_static
 	&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
-      __signal_safe_free (dtv[1 + cnt].pointer.val);
+      free (dtv[1 + cnt].pointer.val);
   memset (dtv, '\0', (dtv[-1].counter + 1) * sizeof (dtv_t));
 }
 
@@ -491,11 +491,11 @@ _dl_deallocate_tls (void *tcb, bool dealloc_tcb)
   for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
     if (! dtv[1 + cnt].pointer.is_static
 	&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
-      __signal_safe_free (dtv[1 + cnt].pointer.val);
+      free (dtv[1 + cnt].pointer.val);
 
   /* The array starts with dtv[-1].  */
   if (dtv != GL(dl_initial_dtv))
-    __signal_safe_free (dtv - 1);
+    free (dtv - 1);
 
   if (dealloc_tcb)
     {
@@ -537,7 +537,8 @@ static void *
 allocate_and_init (struct link_map *map)
 {
   void *newp;
-  newp = __signal_safe_memalign (map->l_tls_align, map->l_tls_blocksize);
+
+  newp = __libc_memalign (map->l_tls_align, map->l_tls_blocksize);
   if (newp == NULL)
     oom ();
 
@@ -607,27 +608,25 @@ _dl_update_slotinfo (unsigned long int req_modid)
 	      if (gen <= dtv[0].counter)
 		continue;
 
-	      size_t modid = total + cnt;
-
 	      /* If there is no map this means the entry is empty.  */
 	      struct link_map *map = listp->slotinfo[cnt].map;
 	      if (map == NULL)
 		{
 		  /* If this modid was used at some point the memory
 		     might still be allocated.  */
-		  if (dtv[-1].counter >= modid
-		      && !dtv[modid].pointer.is_static
-		      && dtv[modid].pointer.val != TLS_DTV_UNALLOCATED)
+		  if (! dtv[total + cnt].pointer.is_static
+		      && dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED)
 		    {
-		      __signal_safe_free (dtv[modid].pointer.val);
-		      dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
+		      free (dtv[total + cnt].pointer.val);
+		      dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
 		    }
 
 		  continue;
 		}
 
-	      assert (modid == map->l_tls_modid);
 	      /* Check whether the current dtv array is large enough.  */
+	      size_t modid = map->l_tls_modid;
+	      assert (total + cnt == modid);
 	      if (dtv[-1].counter < modid)
 		{
 		  /* Reallocate the dtv.  */
@@ -641,18 +640,17 @@ _dl_update_slotinfo (unsigned long int req_modid)
 		    {
 		      /* This is the initial dtv that was allocated
 			 during rtld startup using the dl-minimal.c
-			 malloc instead of the real allocator.  We can't
+			 malloc instead of the real malloc.  We can't
 			 free it, we have to abandon the old storage.  */
 
-		      newp = __signal_safe_malloc (
-					(2 + newsize) * sizeof (dtv_t));
+		      newp = malloc ((2 + newsize) * sizeof (dtv_t));
 		      if (newp == NULL)
 			oom ();
 		      memcpy (newp, &dtv[-1], (2 + oldsize) * sizeof (dtv_t));
 		    }
 		  else
 		    {
-		      newp = __signal_safe_realloc (&dtv[-1],
+		      newp = realloc (&dtv[-1],
 				      (2 + newsize) * sizeof (dtv_t));
 		      if (newp == NULL)
 			oom ();
@@ -682,7 +680,7 @@ _dl_update_slotinfo (unsigned long int req_modid)
 		   deallocate even if it is this dtv entry we are
 		   supposed to load.  The reason is that we call
 		   memalign and not malloc.  */
-		__signal_safe_free (dtv[modid].pointer.val);
+		free (dtv[modid].pointer.val);
 
 	      /* This module is loaded dynamically- We defer memory
 		 allocation.  */