this was discussed on the mailing list and no consensus on the preferred solution was reached, so in anticipation of a release, i'm just committing a minimally-invasive solution that avoids the problem by ensuring that multi-threaded-capable programs will always have initialized the thread pointer before any signal handler can run. in the long term we may switch to initializing the thread pointer at program start time whenever the program has the potential to access any per-thread data.
35 lines
886 B
C
35 lines
886 B
C
#include "pthread_impl.h"
|
|
|
|
static struct pthread main_thread;
|
|
|
|
/* pthread_key_create.c overrides this */
|
|
static const void *dummy[1] = { 0 };
|
|
weak_alias(dummy, __pthread_tsd_main);
|
|
|
|
static int init_main_thread()
|
|
{
|
|
if (__set_thread_area(&main_thread) < 0) return -1;
|
|
main_thread.canceldisable = libc.canceldisable;
|
|
main_thread.tsd = (void **)__pthread_tsd_main;
|
|
main_thread.errno_ptr = __errno_location();
|
|
main_thread.self = &main_thread;
|
|
main_thread.tid = main_thread.pid =
|
|
__syscall(SYS_set_tid_address, &main_thread.tid);
|
|
libc.main_thread = &main_thread;
|
|
return 0;
|
|
}
|
|
|
|
pthread_t __pthread_self_def()
|
|
{
|
|
static int init, failed;
|
|
if (!init) {
|
|
if (failed) return 0;
|
|
if (init_main_thread() < 0) failed = 1;
|
|
if (failed) return 0;
|
|
init = 1;
|
|
}
|
|
return __pthread_self();
|
|
}
|
|
|
|
weak_alias(__pthread_self_def, pthread_self);
|
|
weak_alias(__pthread_self_def, __pthread_self_init);
|