Blob


1 #include <u.h>
2 #include <sched.h>
3 #include <signal.h>
4 #include <libc.h>
5 #include "9proc.h"
7 int fforkstacksize = 16384;
9 static int
10 tramp(void *v)
11 {
12 void (*fn)(void*), *arg;
13 void **v2;
15 _p9uproc(0);
16 v2 = v;
17 fn = v2[0];
18 arg = v2[1];
19 free(v2);
20 fn(arg);
21 return 0;
22 }
24 int
25 ffork(int flags, void (*fn)(void*), void *arg)
26 {
27 void **v;
28 char *p;
29 int cloneflag, pid;
31 _p9uproc(0);
32 p = malloc(fforkstacksize);
33 v = malloc(sizeof(void*)*2);
34 if(p==nil || v==nil){
35 free(p);
36 free(v);
37 return -1;
38 }
39 cloneflag = 0;
40 flags &= ~RFPROC;
41 if(flags&RFMEM){
42 cloneflag |= CLONE_VM;
43 flags &= ~RFMEM;
44 }
45 if(!(flags&RFFDG))
46 cloneflag |= CLONE_FILES;
47 else
48 flags &= ~RFFDG;
49 if(!(flags&RFNOWAIT))
50 cloneflag |= SIGCHLD;
51 else
52 flags &= ~RFNOWAIT;
53 if(flags){
54 fprint(2, "unknown rfork flags %x\n", flags);
55 free(p);
56 free(v);
57 return -1;
58 }
59 v[0] = fn;
60 v[1] = arg;
61 pid = clone(tramp, p+fforkstacksize-16, cloneflag, v);
62 if(pid < 0)
63 free(p);
64 return pid;
65 }
67 int
68 getfforkid(void)
69 {
70 return getpid();
71 }