diff options
Diffstat (limited to 'src/lib9/ffork-Linux.c')
| -rw-r--r-- | src/lib9/ffork-Linux.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/src/lib9/ffork-Linux.c b/src/lib9/ffork-Linux.c index 3b5c8ee0..8ec5ec3e 100644 --- a/src/lib9/ffork-Linux.c +++ b/src/lib9/ffork-Linux.c @@ -1,18 +1,41 @@ +#include <u.h> #include <sched.h> #include <signal.h> -#include <lib9.h> +#include <libc.h> +#include "9proc.h" int fforkstacksize = 16384; +static int +tramp(void *v) +{ + void (*fn)(void*), *arg; + void **v2; + + _p9uproc(0); + v2 = v; + fn = v2[0]; + arg = v2[1]; + free(v2); + fn(arg); + return 0; +} + int ffork(int flags, void (*fn)(void*), void *arg) { + void **v; char *p; int cloneflag, pid; + _p9uproc(0); p = malloc(fforkstacksize); - if(p == nil) + v = malloc(sizeof(void*)*2); + if(p==nil || v==nil){ + free(p); + free(v); return -1; + } cloneflag = 0; flags &= ~RFPROC; if(flags&RFMEM){ @@ -29,9 +52,13 @@ ffork(int flags, void (*fn)(void*), void *arg) flags &= ~RFNOWAIT; if(flags){ fprint(2, "unknown rfork flags %x\n", flags); + free(p); + free(v); return -1; } - pid = clone((int(*)(void*))fn, p+fforkstacksize-16, cloneflag, arg); + v[0] = fn; + v[1] = arg; + pid = clone(tramp, p+fforkstacksize-16, cloneflag, v); if(pid < 0) free(p); return pid; |
