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>
5 b2cfc4e2 2003-09-30 devnull int fforkstacksize = 16384;
8 b2cfc4e2 2003-09-30 devnull ffork(int flags, void (*fn)(void*), void *arg)
11 b2cfc4e2 2003-09-30 devnull int cloneflag, pid;
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;
22 b2cfc4e2 2003-09-30 devnull if(!(flags&RFFDG))
23 b2cfc4e2 2003-09-30 devnull cloneflag |= CLONE_FILES;
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;
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;
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)
37 b2cfc4e2 2003-09-30 devnull return pid;
41 a995e477 2003-10-01 devnull getfforkid(void)
43 a995e477 2003-10-01 devnull return getpid();