diff options
| author | rsc <devnull@localhost> | 2004-04-30 02:16:28 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2004-04-30 02:16:28 +0000 |
| commit | b1455f33a8a7b6826fcb0d4b3f4849e322755d28 (patch) | |
| tree | f6e2e927fd33ad4fb6442744f85759fa761b1220 /src/lib9/ffork-Linux.c | |
| parent | be36ff68854c86247fdc769c0eaa89eb284b5ca7 (diff) | |
| download | plan9port-b1455f33a8a7b6826fcb0d4b3f4849e322755d28.tar.gz plan9port-b1455f33a8a7b6826fcb0d4b3f4849e322755d28.zip | |
Little fixes.
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; |
