From 40bae2d32fd6f3ffea437fa745ad38a1fe77b27e Mon Sep 17 00:00:00 2001 From: Rich Felker Date: Wed, 9 May 2018 00:33:54 -0400 Subject: make linking of thread-start with explicit scheduling conditional the wrapper start function that performs scheduling operations is unreachable if pthread_attr_setinheritsched is never called, so move it there rather than the pthread_create source file, saving some code size for static-linked programs. --- src/thread/pthread_create.c | 35 +++++++---------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) (limited to 'src/thread/pthread_create.c') diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index 5f07ab49..2c066cff 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -19,6 +19,12 @@ weak_alias(dummy_0, __pthread_tsd_run_dtors); 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(); @@ -132,33 +138,6 @@ void __do_cleanup_pop(struct __ptcb *cb) __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; @@ -302,7 +281,7 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att 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); } -- cgit v1.2.1