summaryrefslogtreecommitdiff
path: root/concurrency.c
diff options
context:
space:
mode:
authorglenda <glenda@cirno>2022-09-14 08:26:29 +0000
committerglenda <glenda@cirno>2022-09-14 08:26:29 +0000
commit544f90f798a7ebd76b71f094d4cd77f6166e606b (patch)
treee8ce5356dc52300bbe9aaa8fc460c6e0f179d37e /concurrency.c
parent2c2af66200badebe076570038daf4cacf47a1281 (diff)
More demos, and lock thread spawning
Diffstat (limited to 'concurrency.c')
-rw-r--r--concurrency.c14
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();