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 Workerstatic 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 Workervoid __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 Workerpid_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