mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08:00
hurd: let csu initialize tls
Since 9cec82de71
("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.
This commit is contained in:
parent
7b358de1af
commit
2ce0481d26
@ -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
|
||||
|
@ -184,9 +184,6 @@ init (int *data)
|
||||
_dl_phnum = d->phdrsz / sizeof (ElfW(Phdr));
|
||||
assert (d->phdrsz % sizeof (ElfW(Phdr)) == 0);
|
||||
}
|
||||
|
||||
/* We need to setup TLS before initializing libpthread. */
|
||||
__libc_setup_tls ();
|
||||
#endif
|
||||
|
||||
/* Call `init1' (above) with the user code as the return address, and the
|
||||
|
@ -1,31 +0,0 @@
|
||||
/* Hurd definitions for libc main startup.
|
||||
Copyright (C) 2017-2021 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef _LIBC_START_H
|
||||
#define _LIBC_START_H
|
||||
|
||||
#ifndef SHARED
|
||||
/* By default we perform STT_GNU_IFUNC resolution *before* TLS
|
||||
initialization, and this means you cannot, without machine
|
||||
knowledge, access TLS from an IFUNC resolver. */
|
||||
#define ARCH_SETUP_IREL() apply_irel ()
|
||||
#define ARCH_SETUP_TLS()
|
||||
#define ARCH_APPLY_IREL()
|
||||
#endif /* ! SHARED */
|
||||
|
||||
#endif /* _LIBC_START_H */
|
Loading…
Reference in New Issue
Block a user