From 2ce0481d26066b7d4e2c950da555a7ca20e313fb Mon Sep 17 00:00:00 2001 From: Samuel Thibault Date: Tue, 28 Dec 2021 10:15:52 +0100 Subject: 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. --- hurd/hurd/userlink.h | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) (limited to 'hurd') 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 -- cgit 1.4.1