diff options
Diffstat (limited to 'concurrency.c')
-rw-r--r-- | concurrency.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/concurrency.c b/concurrency.c index ec75474..31464f7 100644 --- a/concurrency.c +++ b/concurrency.c @@ -10,13 +10,14 @@ typedef struct SpawnData SpawnData; struct SpawnData { Function func; + Array *name; Array *left; Array *right; Channel *setupdone; }; static void newprocfn(void *); -static ThreadData *newthreaddata(void); +static ThreadData *newthreaddata(Array *); /* global data */ static Lock threadlock; @@ -39,13 +40,15 @@ recvtimeout(void *raw) void initthreads(void) { - ThreadData *td = newthreaddata(); + Array *name = mkrunearray(L"main"); + ThreadData *td = newthreaddata(name); void **tdptr = procdata(); *tdptr = td; + freearray(name); } int -spawnthread(Function f, Array *left, Array *right) +spawnthread(Function f, Array *name, Array *left, Array *right) { /* lock the data structures */ /* Spawn a new proc */ @@ -62,6 +65,7 @@ spawnthread(Function f, Array *left, Array *right) Channel *setupdone = chancreate(sizeof(int), 0); SpawnData *sp = emalloc(sizeof(SpawnData)); sp->func = dupfunction(f); + sp->name = duparray(name); sp->left = left ? duparray(left) : nil; sp->right = duparray(right); sp->setupdone = setupdone; @@ -179,7 +183,7 @@ static void newprocfn(void *data) { SpawnData *sp = (SpawnData *)data; - ThreadData *td = newthreaddata(); + ThreadData *td = newthreaddata(sp->name); void **tdptr = procdata(); *tdptr = td; ErrorGuard *eg = newerrorguard(mkscalarint(0), nil); /* make a catch-all error guard */ @@ -205,6 +209,7 @@ newprocfn(void *data) break; } unlock(&threadlock); + freearray(sp->name); freearray(sp->left); freearray(sp->right); freefunction(sp->func); @@ -213,7 +218,7 @@ newprocfn(void *data) } static ThreadData * -newthreaddata(void) +newthreaddata(Array *name) { ThreadData *td = emallocz(sizeof(ThreadData), 1); td->id = threadid(); @@ -223,6 +228,7 @@ newthreaddata(void) td->timeout = 0; td->timedout = 0; td->newmail.l = &td->lock; + td->name = fnSame(name); lock(&threadlock); nthreads++; @@ -257,8 +263,11 @@ taskproperty(vlong t, vlong p) res = mkscalarint(-1); else switch(p){ - case 0: - res = mkscalarint(t); /* thread id */ + case 0: /* thread id */ + res = mkscalarint(td->id); + break; + case 1: /* thread name */ + res = fnSame(td->name); break; default: unlock(&threadlock); |