weak_alias(dummy_0, __do_orphaned_stdio_locks);
weak_alias(dummy_0, __dl_thread_cleanup);
+static void *dummy_1(void *p)
+{
+ return 0;
+}
+weak_alias(dummy_1, __start_sched);
+
_Noreturn void __pthread_exit(void *result)
{
pthread_t self = __pthread_self();
__pthread_self()->cancelbuf = cb->__next;
}
-struct start_sched_args {
- void *start_arg;
- void *(*start_fn)(void *);
- sigset_t mask;
- pthread_attr_t *attr;
- volatile int futex;
-};
-
-static void *start_sched(void *p)
-{
- struct start_sched_args *ssa = p;
- void *start_arg = ssa->start_arg;
- void *(*start_fn)(void *) = ssa->start_fn;
- pthread_t self = __pthread_self();
-
- int ret = -__syscall(SYS_sched_setscheduler, self->tid,
- ssa->attr->_a_policy, &ssa->attr->_a_prio);
- if (!ret) __restore_sigs(&ssa->mask);
- a_store(&ssa->futex, ret);
- __wake(&ssa->futex, 1, 1);
- if (ret) {
- self->detach_state = DT_DYNAMIC;
- return 0;
- }
- return start_fn(start_arg);
-}
-
static int start(void *p)
{
pthread_t self = p;
weak_alias(dummy_tsd, __pthread_tsd_main);
volatile int __block_new_threads = 0;
-size_t __default_stacksize = DEFAULT_STACK_SIZE;
-size_t __default_guardsize = DEFAULT_GUARD_SIZE;
+extern size_t __default_stacksize;
+extern size_t __default_guardsize;
static FILE *volatile dummy_file = 0;
weak_alias(dummy_file, __stdin_used);
ssa.start_fn = new->start;
ssa.start_arg = new->start_arg;
ssa.attr = &attr;
- new->start = start_sched;
+ new->start = __start_sched;
new->start_arg = &ssa;
__block_app_sigs(&ssa.mask);
}
if (do_sched) {
__futexwait(&ssa.futex, -1, 1);
+ ret = ssa.futex;
if (ret) return ret;
}