summaryrefslogtreecommitdiff
path: root/concurrency.c
diff options
context:
space:
mode:
authorglenda <glenda@cirno>2022-09-09 21:28:52 +0000
committerglenda <glenda@cirno>2022-09-09 21:28:52 +0000
commitdcadd54d64d13dba04784df68570475e389187b7 (patch)
tree4c57332e119a4129b7701b6a4ed48743c4441771 /concurrency.c
parentd2b44ec9fc7bf4687dae74edfe708395461b5b6e (diff)
Add thread names
Diffstat (limited to 'concurrency.c')
-rw-r--r--concurrency.c23
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);