xref: /aosp_15_r20/external/musl/src/process/_Fork.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <unistd.h>
2*c9945492SAndroid Build Coastguard Worker #include <signal.h>
3*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
4*c9945492SAndroid Build Coastguard Worker #include "libc.h"
5*c9945492SAndroid Build Coastguard Worker #include "lock.h"
6*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
7*c9945492SAndroid Build Coastguard Worker #include "aio_impl.h"
8*c9945492SAndroid Build Coastguard Worker #include "fork_impl.h"
9*c9945492SAndroid Build Coastguard Worker 
dummy(int x)10*c9945492SAndroid Build Coastguard Worker static void dummy(int x) { }
11*c9945492SAndroid Build Coastguard Worker weak_alias(dummy, __aio_atfork);
12*c9945492SAndroid Build Coastguard Worker 
__post_Fork(int ret)13*c9945492SAndroid Build Coastguard Worker void __post_Fork(int ret)
14*c9945492SAndroid Build Coastguard Worker {
15*c9945492SAndroid Build Coastguard Worker 	if (!ret) {
16*c9945492SAndroid Build Coastguard Worker 		pthread_t self = __pthread_self();
17*c9945492SAndroid Build Coastguard Worker 		self->tid = __syscall(SYS_set_tid_address, &__thread_list_lock);
18*c9945492SAndroid Build Coastguard Worker 		self->robust_list.off = 0;
19*c9945492SAndroid Build Coastguard Worker 		self->robust_list.pending = 0;
20*c9945492SAndroid Build Coastguard Worker 		self->next = self->prev = self;
21*c9945492SAndroid Build Coastguard Worker 		__thread_list_lock = 0;
22*c9945492SAndroid Build Coastguard Worker 		libc.threads_minus_1 = 0;
23*c9945492SAndroid Build Coastguard Worker 		if (libc.need_locks) libc.need_locks = -1;
24*c9945492SAndroid Build Coastguard Worker 	}
25*c9945492SAndroid Build Coastguard Worker 	UNLOCK(__abort_lock);
26*c9945492SAndroid Build Coastguard Worker 	if (!ret) __aio_atfork(1);
27*c9945492SAndroid Build Coastguard Worker }
28*c9945492SAndroid Build Coastguard Worker 
_Fork(void)29*c9945492SAndroid Build Coastguard Worker pid_t _Fork(void)
30*c9945492SAndroid Build Coastguard Worker {
31*c9945492SAndroid Build Coastguard Worker 	pid_t ret;
32*c9945492SAndroid Build Coastguard Worker 	sigset_t set;
33*c9945492SAndroid Build Coastguard Worker 	__block_all_sigs(&set);
34*c9945492SAndroid Build Coastguard Worker 	LOCK(__abort_lock);
35*c9945492SAndroid Build Coastguard Worker #ifdef SYS_fork
36*c9945492SAndroid Build Coastguard Worker 	ret = __syscall(SYS_fork);
37*c9945492SAndroid Build Coastguard Worker #else
38*c9945492SAndroid Build Coastguard Worker 	ret = __syscall(SYS_clone, SIGCHLD, 0);
39*c9945492SAndroid Build Coastguard Worker #endif
40*c9945492SAndroid Build Coastguard Worker 	__post_Fork(ret);
41*c9945492SAndroid Build Coastguard Worker 	__restore_sigs(&set);
42*c9945492SAndroid Build Coastguard Worker 	return __syscall_ret(ret);
43*c9945492SAndroid Build Coastguard Worker }
44