Blame


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