about summary refs log tree commit diff
path: root/hurd/hurd
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-28 10:15:52 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-12-28 10:15:52 +0100
commit2ce0481d26066b7d4e2c950da555a7ca20e313fb (patch)
tree107a3a13e10f667b0a6a87afd8496ff8b451bf27 /hurd/hurd
parent7b358de1af5473217fa1cee3838997add91c8311 (diff)
downloadglibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.tar.gz
glibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.tar.xz
glibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.zip
hurd: let csu initialize tls
Since 9cec82de715b ("htl: Initialize later"), we let csu initialize
pthreads. We can thus let it initialize tls later too, to better align
with the generic order.  Initialization however accesses ports which
links/unlinks into the sigstate for unwinding.  We can however easily
skip that during initialization.
Diffstat (limited to 'hurd/hurd')
-rw-r--r--hurd/hurd/userlink.h39
1 files changed, 24 insertions, 15 deletions
diff --git a/hurd/hurd/userlink.h b/hurd/hurd/userlink.h
index 4b5ba96cf2..0301658bfa 100644
--- a/hurd/hurd/userlink.h
+++ b/hurd/hurd/userlink.h
@@ -98,13 +98,16 @@ _hurd_userlink_link (struct hurd_userlink **chainp,
   link->resource.prevp = chainp;
   *chainp = link;
 
-  /* Also chain it on the current thread's list of active resources.  */
-  thread_chainp = &_hurd_self_sigstate ()->active_resources;
-  link->thread.next = *thread_chainp;
-  if (link->thread.next)
-    link->thread.next->thread.prevp = &link->thread.next;
-  link->thread.prevp = thread_chainp;
-  *thread_chainp = link;
+  if (!__LIBC_NO_TLS ())
+    {
+      /* Also chain it on the current thread's list of active resources.  */
+      thread_chainp = &_hurd_self_sigstate ()->active_resources;
+      link->thread.next = *thread_chainp;
+      if (link->thread.next)
+	link->thread.next->thread.prevp = &link->thread.next;
+      link->thread.prevp = thread_chainp;
+      *thread_chainp = link;
+    }
 }
 # endif
 #endif
@@ -131,11 +134,14 @@ _hurd_userlink_unlink (struct hurd_userlink *link)
   if (link->resource.next)
     link->resource.next->resource.prevp = link->resource.prevp;
 
-  /* Remove our link from the chain of currently active resources
-     for this thread.  */
-  *link->thread.prevp = link->thread.next;
-  if (link->thread.next)
-    link->thread.next->thread.prevp = link->thread.prevp;
+  if (!__LIBC_NO_TLS ())
+    {
+      /* Remove our link from the chain of currently active resources
+	 for this thread.  */
+      *link->thread.prevp = link->thread.next;
+      if (link->thread.next)
+	link->thread.next->thread.prevp = link->thread.prevp;
+    }
 
   return dealloc;
 }
@@ -160,9 +166,12 @@ _hurd_userlink_move (struct hurd_userlink *new_link,
     new_link->resource.next->resource.prevp = &new_link->resource.next;
   *new_link->resource.prevp = new_link;
 
-  if (new_link->thread.next != NULL)
-    new_link->thread.next->thread.prevp = &new_link->thread.next;
-  *new_link->thread.prevp = new_link;
+  if (!__LIBC_NO_TLS ())
+    {
+      if (new_link->thread.next != NULL)
+	new_link->thread.next->thread.prevp = &new_link->thread.next;
+      *new_link->thread.prevp = new_link;
+    }
 }
 # endif
 #endif