diff options
Diffstat (limited to 'concurrency.c')
-rw-r--r-- | concurrency.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/concurrency.c b/concurrency.c index 9670866..6719e6a 100644 --- a/concurrency.c +++ b/concurrency.c @@ -12,6 +12,8 @@ struct SpawnData Array *name; Array *left; Array *right; + QLock lock; + Rendez done; }; static void newprocfn(SpawnData *); @@ -64,18 +66,22 @@ spawnthread(Function f, Array *name, Array *left, Array *right) unlock datastructures exit proc */ - SpawnData *sp = emalloc(sizeof(SpawnData)); + SpawnData *sp = emallocz(sizeof(SpawnData), 1); sp->func = dupfunction(f); sp->func.scope = dupscope(f.scope); sp->name = duparray(name); sp->left = left ? duparray(left) : nil; sp->right = duparray(right); - + sp->done.l = &sp->lock; + + qlock(&sp->lock); int id = rfork(RFPROC|RFMEM); if(id == 0){ /* in new process*/ newprocfn(sp); exits(nil); } + rsleep(&sp->done); + qunlock(&sp->lock); return id; } @@ -189,8 +195,12 @@ Retry: static void newprocfn(SpawnData *sp) { + qlock(&sp->lock); ThreadData *td = newthreaddata(sp->name); _privates[0] = td; + rwakeup(&sp->done); + qunlock(&sp->lock); + ErrorGuard *eg = newerrorguard(mkscalarint(0), nil); /* make a catch-all error guard */ if(setjmp(eg->jmp)) displayerror(); |