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_attr_setinheritsched.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'src/thread/pthread_attr_setinheritsched.c') diff --git a/src/thread/pthread_attr_setinheritsched.c b/src/thread/pthread_attr_setinheritsched.c index c91d8f83..e540e846 100644 --- a/src/thread/pthread_attr_setinheritsched.c +++ b/src/thread/pthread_attr_setinheritsched.c @@ -1,4 +1,25 @@ #include "pthread_impl.h" +#include "syscall.h" + +__attribute__((__visibility__("hidden"))) +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); +} int pthread_attr_setinheritsched(pthread_attr_t *a, int inherit) { -- cgit v1.2.1