diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-28 10:15:52 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-12-28 10:15:52 +0100 |
commit | 2ce0481d26066b7d4e2c950da555a7ca20e313fb (patch) | |
tree | 107a3a13e10f667b0a6a87afd8496ff8b451bf27 /hurd | |
parent | 7b358de1af5473217fa1cee3838997add91c8311 (diff) | |
download | glibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.zip glibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.tar.gz glibc-2ce0481d26066b7d4e2c950da555a7ca20e313fb.tar.bz2 |
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')
-rw-r--r-- | hurd/hurd/userlink.h | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/hurd/hurd/userlink.h b/hurd/hurd/userlink.h index 4b5ba96..0301658 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 |