1#include <unistd.h> 2#include <string.h> 3#include <signal.h> 4#include "syscall.h" 5#include "libc.h" 6#include "pthread_impl.h" 7 8static void dummy(int x) 9{ 10} 11 12weak_alias(dummy, __fork_handler); 13 14pid_t fork(void) 15{ 16 pid_t ret; 17 sigset_t set; 18 __fork_handler(-1); 19 __block_all_sigs(&set); 20#ifdef SYS_fork 21 ret = syscall(SYS_fork); 22#else 23 ret = syscall(SYS_clone, SIGCHLD, 0); 24#endif 25 if (!ret) { 26 pthread_t self = __pthread_self(); 27 self->tid = __syscall(SYS_gettid); 28 self->robust_list.off = 0; 29 self->robust_list.pending = 0; 30 libc.threads_minus_1 = 0; 31 } 32 __restore_sigs(&set); 33 __fork_handler(!ret); 34 return ret; 35} 36