From 544f90f798a7ebd76b71f094d4cd77f6166e606b Mon Sep 17 00:00:00 2001 From: glenda Date: Wed, 14 Sep 2022 08:26:29 +0000 Subject: More demos, and lock thread spawning --- concurrency.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'concurrency.c') 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(); -- cgit v1.2.3