diff options
author | Rich Felker <dalias@aerifal.cx> | 2018-05-09 00:33:54 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2018-05-09 00:37:49 -0400 |
commit | 40bae2d32fd6f3ffea437fa745ad38a1fe77b27e (patch) | |
tree | a69ba86fa80860f0248778a782c0b18a226bc0c2 /src | |
parent | b8742f32602add243ee2ce74d804015463726899 (diff) | |
download | musl-40bae2d32fd6f3ffea437fa745ad38a1fe77b27e.tar.gz musl-40bae2d32fd6f3ffea437fa745ad38a1fe77b27e.tar.bz2 musl-40bae2d32fd6f3ffea437fa745ad38a1fe77b27e.tar.xz musl-40bae2d32fd6f3ffea437fa745ad38a1fe77b27e.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/internal/pthread_impl.h | 8 | ||||
-rw-r--r-- | src/thread/pthread_attr_setinheritsched.c | 21 | ||||
-rw-r--r-- | src/thread/pthread_create.c | 35 |
3 files changed, 36 insertions, 28 deletions
diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h index 69352ef2..c2deffb9 100644 --- a/src/internal/pthread_impl.h +++ b/src/internal/pthread_impl.h @@ -56,6 +56,14 @@ struct pthread { void **dtv_copy; }; +struct start_sched_args { + void *start_arg; + void *(*start_fn)(void *); + sigset_t mask; + pthread_attr_t *attr; + volatile int futex; +}; + enum { DT_EXITED = 0, DT_EXITING, 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) { 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); } |