replace all remaining internal uses of pthread_self with __pthread_self
[musl] / src / thread / pthread_create.c
index d26f252..7a2f172 100644 (file)
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE
 #include "pthread_impl.h"
 #include "stdio_impl.h"
 #include "libc.h"
@@ -12,7 +13,7 @@ weak_alias(dummy_0, __pthread_tsd_run_dtors);
 
 _Noreturn void pthread_exit(void *result)
 {
-       pthread_t self = pthread_self();
+       pthread_t self = __pthread_self();
        sigset_t set;
 
        self->result = result;
@@ -76,13 +77,15 @@ _Noreturn void pthread_exit(void *result)
 
 void __do_cleanup_push(struct __ptcb *cb)
 {
-       struct pthread *self = pthread_self();
+       if (!libc.has_thread_pointer) return;
+       struct pthread *self = __pthread_self();
        cb->__next = self->cancelbuf;
        self->cancelbuf = cb;
 }
 
 void __do_cleanup_pop(struct __ptcb *cb)
 {
+       if (!libc.has_thread_pointer) return;
        __pthread_self()->cancelbuf = cb->__next;
 }
 
@@ -109,6 +112,8 @@ static int start(void *p)
 /* pthread_key_create.c overrides this */
 static const size_t dummy = 0;
 weak_alias(dummy, __pthread_tsd_size);
+static void *const dummy_tsd[1] = { 0 };
+weak_alias(dummy_tsd, __pthread_tsd_main);
 
 static FILE *const dummy_file = 0;
 weak_alias(dummy_file, __stdin_used);
@@ -126,19 +131,24 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
 {
        int ret;
        size_t size, guard;
-       struct pthread *self = pthread_self(), *new;
+       struct pthread *self, *new;
        unsigned char *map = 0, *stack = 0, *tsd = 0, *stack_limit;
-       unsigned flags = 0x7d8f00;
+       unsigned flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND
+               | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS
+               | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID | CLONE_DETACHED;
        int do_sched = 0;
        pthread_attr_t attr = {0};
 
-       if (!self) return ENOSYS;
+       if (!libc.can_do_threads) return ENOSYS;
+       self = __pthread_self();
        if (!libc.threaded) {
                for (FILE *f=libc.ofl_head; f; f=f->next)
                        init_file_lock(f);
                init_file_lock(__stdin_used);
                init_file_lock(__stdout_used);
                init_file_lock(__stderr_used);
+               __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, _NSIG/8);
+               self->tsd = (void **)__pthread_tsd_main;
                libc.threaded = 1;
        }
        if (attrp) attr = *attrp;
@@ -198,7 +208,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
        new->tsd = (void *)tsd;
        if (attr._a_detach) {
                new->detached = 1;
-               flags -= 0x200000;
+               flags -= CLONE_CHILD_CLEARTID;
        }
        if (attr._a_sched) {
                do_sched = new->startlock[0] = 1;