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 int10 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 int25 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 else48 flags &= ~RFFDG;49 if(!(flags&RFNOWAIT))50 cloneflag |= SIGCHLD;51 else52 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 int68 getfforkid(void)69 {70 return getpid();71 }