Files
semi-libc/src/thread/pthread_self.c
T
Rich Felker 2f437040e7 fix (hopefully) all hard-coded 8's for kernel sigset_t size
some minor changes to how hard-coded sets for thread-related purposes
are handled were also needed, since the old object sizes were not
necessarily sufficient. things have gotten a bit ugly in this area,
and i think a cleanup is in order at some point, but for now the goal
is just to get the code working on all supported archs including mips,
which was badly broken by linux rejecting syscalls with the wrong
sigset_t size.
2012-08-09 22:52:13 -04:00

38 lines
964 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()
{
__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
SIGPT_SET, 0, __SYSCALL_SSLEN);
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);