|
|
|
@ -44,18 +44,6 @@ void __pthread_unwind_next(struct __ptcb *cb) |
|
|
|
__syscall(SYS_exit, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static void init_threads() |
|
|
|
{ |
|
|
|
sigset_t set; |
|
|
|
libc.lock = __lock; |
|
|
|
libc.lockfile = __lockfile; |
|
|
|
|
|
|
|
sigemptyset(&set); |
|
|
|
sigaddset(&set, SIGSYSCALL); |
|
|
|
sigaddset(&set, SIGCANCEL); |
|
|
|
__libc_sigprocmask(SIG_UNBLOCK, &set, 0); |
|
|
|
} |
|
|
|
|
|
|
|
static int start(void *p) |
|
|
|
{ |
|
|
|
struct pthread *self = p; |
|
|
|
@ -79,7 +67,6 @@ weak_alias(dummy, __pthread_tsd_size); |
|
|
|
|
|
|
|
int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(void *), void *arg) |
|
|
|
{ |
|
|
|
static int init; |
|
|
|
int ret; |
|
|
|
size_t size, guard; |
|
|
|
struct pthread *self = pthread_self(), *new; |
|
|
|
@ -87,7 +74,14 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo |
|
|
|
const pthread_attr_t default_attr = { 0 }; |
|
|
|
|
|
|
|
if (!self) return ENOSYS; |
|
|
|
if (!init && ++init) init_threads(); |
|
|
|
if (!libc.threaded) { |
|
|
|
sigset_t set; |
|
|
|
sigemptyset(&set); |
|
|
|
sigaddset(&set, SIGSYSCALL); |
|
|
|
sigaddset(&set, SIGCANCEL); |
|
|
|
__libc_sigprocmask(SIG_UNBLOCK, &set, 0); |
|
|
|
libc.threaded = 1; |
|
|
|
} |
|
|
|
|
|
|
|
if (!attr) attr = &default_attr; |
|
|
|
guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE); |
|
|
|
|