From b1455f33a8a7b6826fcb0d4b3f4849e322755d28 Mon Sep 17 00:00:00 2001 From: rsc Date: Fri, 30 Apr 2004 02:16:28 +0000 Subject: Little fixes. --- src/lib9/_p9proc.c | 10 +++++++--- src/lib9/ffork-FreeBSD.c | 7 ++++++- src/lib9/ffork-Linux.c | 33 ++++++++++++++++++++++++++++++--- src/lib9/ffork-pthread.c | 3 +++ src/lib9/main.c | 1 + 5 files changed, 47 insertions(+), 7 deletions(-) (limited to 'src/lib9') diff --git a/src/lib9/_p9proc.c b/src/lib9/_p9proc.c index 9454d079..813c3d9b 100644 --- a/src/lib9/_p9proc.c +++ b/src/lib9/_p9proc.c @@ -45,14 +45,17 @@ _p9uproc(int inhandler) h = 0; } - if(inhandler) - sysfatal("did not find uproc in signal handler"); + if(inhandler){ + fprint(2, "%s: did not find uproc for pid %d in signal handler\n", argv0, pid); + abort(); + } /* need to allocate */ while((up = mallocz(sizeof(Uproc), 1)) == nil) sleep(1000); - up = mallocz(sizeof(Uproc), 1); +fprint(2, "alloc uproc for pid %d\n", pid); + up->pid = pid; lock(&uproclock); h = pid%PIDHASH; for(i=0; i #include #include -#include +#include +#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; diff --git a/src/lib9/ffork-pthread.c b/src/lib9/ffork-pthread.c index ff61ed10..24b987b3 100644 --- a/src/lib9/ffork-pthread.c +++ b/src/lib9/ffork-pthread.c @@ -14,8 +14,11 @@ ffork(int flags, void(*fn)(void*), void *arg) return -1; } + _p9uproc(0); if(pthread_create(&tid, NULL, (void*(*)(void*))fn, arg) < 0) return -1; + if((int)tid == 0) + _p9uproc(0); return (int)tid; } diff --git a/src/lib9/main.c b/src/lib9/main.c index 4a429054..3ff63fd6 100644 --- a/src/lib9/main.c +++ b/src/lib9/main.c @@ -7,6 +7,7 @@ extern void p9main(int, char**); int main(int argc, char **argv) { + _p9uproc(0); p9main(argc, argv); exits("main"); return 99; -- cgit v1.2.3