about summary refs log tree commit diff
path: root/src/thread/pthread_create.c
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2018-05-09 00:33:54 -0400
committerRich Felker <dalias@aerifal.cx>2018-05-09 00:37:49 -0400
commit40bae2d32fd6f3ffea437fa745ad38a1fe77b27e (patch)
treea69ba86fa80860f0248778a782c0b18a226bc0c2 /src/thread/pthread_create.c
parentb8742f32602add243ee2ce74d804015463726899 (diff)
downloadmusl-40bae2d32fd6f3ffea437fa745ad38a1fe77b27e.tar.gz
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/thread/pthread_create.c')
-rw-r--r--src/thread/pthread_create.c35
1 files changed, 7 insertions, 28 deletions
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);
 	}