Blame


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