Blob


1 #include <sched.h>
2 #include <signal.h>
3 #include <lib9.h>
5 int fforkstacksize = 16384;
7 int
8 ffork(int flags, void (*fn)(void*), void *arg)
9 {
10 char *p;
11 int cloneflag, pid;
13 p = malloc(fforkstacksize);
14 if(p == nil)
15 return -1;
16 cloneflag = 0;
17 flags &= ~RFPROC;
18 if(flags&RFMEM){
19 cloneflag |= CLONE_VM;
20 flags &= ~RFMEM;
21 }
22 if(!(flags&RFFDG))
23 cloneflag |= CLONE_FILES;
24 else
25 flags &= ~RFFDG;
26 if(!(flags&RFNOWAIT))
27 cloneflag |= SIGCHLD;
28 else
29 flags &= ~RFNOWAIT;
30 if(flags){
31 fprint(2, "unknown rfork flags %x\n", flags);
32 return -1;
33 }
34 pid = clone((int(*)(void*))fn, p+fforkstacksize-16, cloneflag, arg);
35 if(pid < 0)
36 free(p);
37 return pid;
38 }
40 int
41 getfforkid(void)
42 {
43 return getpid();
44 }