mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-25 04:01:10 +00:00
htl: Initialize ___pthread_self early
When using jemalloc, malloc() needs to use TSD, while libpthread initialization needs malloc(). Having ___pthread_self set early to some static storage allows TSD to work early, thus allowing jemalloc and libpthread to initialize together. This incidentaly simplifies __pthread_enable/disable_asynccancel and __pthread_self, now that ___pthread_self is always initialized.
This commit is contained in:
parent
644aa127b9
commit
53da64d1cf
@ -25,10 +25,6 @@ int __pthread_enable_asynccancel (void)
|
||||
struct __pthread *p = _pthread_self ();
|
||||
int oldtype;
|
||||
|
||||
if (___pthread_self == NULL)
|
||||
/* We are not initialized yet, we can't be cancelled anyway. */
|
||||
return PTHREAD_CANCEL_DEFERRED;
|
||||
|
||||
__pthread_mutex_lock (&p->cancel_lock);
|
||||
oldtype = p->cancel_type;
|
||||
p->cancel_type = PTHREAD_CANCEL_ASYNCHRONOUS;
|
||||
@ -43,10 +39,6 @@ void __pthread_disable_asynccancel (int oldtype)
|
||||
{
|
||||
struct __pthread *p = _pthread_self ();
|
||||
|
||||
if (___pthread_self == NULL)
|
||||
/* We are not initialized yet, we can't be cancelled anyway. */
|
||||
return;
|
||||
|
||||
__pthread_mutex_lock (&p->cancel_lock);
|
||||
p->cancel_type = oldtype;
|
||||
__pthread_mutex_unlock (&p->cancel_lock);
|
||||
|
@ -24,15 +24,7 @@
|
||||
pthread_t
|
||||
__pthread_self (void)
|
||||
{
|
||||
struct __pthread *self;
|
||||
|
||||
if (___pthread_self == NULL)
|
||||
/* We are not initialized yet, we are the first thread. */
|
||||
return 1;
|
||||
|
||||
self = _pthread_self ();
|
||||
assert (self != NULL);
|
||||
|
||||
struct __pthread *self = _pthread_self ();
|
||||
return self->thread;
|
||||
}
|
||||
|
||||
|
@ -26,6 +26,10 @@
|
||||
#include <pt-internal.h>
|
||||
#include <pthreadP.h>
|
||||
|
||||
/* Initial thread structure used temporarily during initialization, so various
|
||||
* functions can already work at least basically. */
|
||||
static struct __pthread init_thread;
|
||||
|
||||
static void
|
||||
reset_pthread_total (void)
|
||||
{
|
||||
@ -47,6 +51,10 @@ _init_routine (void *stack)
|
||||
/* Already initialized */
|
||||
return;
|
||||
|
||||
/* Initialize early thread structure. */
|
||||
init_thread.thread = 1;
|
||||
___pthread_self = &init_thread;
|
||||
|
||||
/* Initialize the library. */
|
||||
___pthread_init ();
|
||||
|
||||
@ -74,6 +82,12 @@ _init_routine (void *stack)
|
||||
__pthread_default_attr.__guardsize = __vm_page_size;
|
||||
#endif
|
||||
|
||||
/* Copy over the thread-specific state */
|
||||
assert (!init_thread.thread_specifics);
|
||||
memcpy (&thread->static_thread_specifics,
|
||||
&init_thread.static_thread_specifics,
|
||||
sizeof (thread->static_thread_specifics));
|
||||
|
||||
___pthread_self = thread;
|
||||
|
||||
/* Decrease the number of threads, to take into account that the
|
||||
|
Loading…
Reference in New Issue
Block a user