1 #define _GNU_SOURCE
2 #include <unistd.h>
3 #include <signal.h>
4 #include "syscall.h"
5 #include "pthread_impl.h"
6 #ifndef __LITEOS__
7 #include "proc_xid_impl.h"
8 #endif
9 
__vfork(void)10 hidden pid_t __vfork(void)
11 {
12 	/* vfork syscall cannot be made from C code */
13 #ifdef SYS_fork
14 	return syscall(SYS_fork);
15 #else
16 	return syscall(SYS_clone, SIGCHLD, 0);
17 #endif
18 }
19 
vfork(void)20 pid_t vfork(void)
21 {
22 	pthread_t self = __pthread_self();
23 	pid_t parent_pid = self->pid;
24 	self->pid = 0;
25 #ifdef __LITEOS__
26 	pid_t ret = __vfork();
27 	if (ret != 0) {
28 		self->pid = parent_pid;
29 	} else {
30 		self->proc_tid = -1;
31 	}
32 #else
33 	int parent_by_vfork = self->by_vfork;
34 	self->by_vfork = 1;
35 	pid_t ret = __vfork();
36 	if (ret != 0) {
37 		self->pid = parent_pid;
38 		self->by_vfork = parent_by_vfork;
39 	} else {
40 		self->proc_tid = -1;
41 		__clear_proc_pid();
42 	}
43 #endif
44 	return ret;
45 }
46