summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apl9.h5
-rw-r--r--concurrency.c23
-rw-r--r--operators.c28
3 files changed, 35 insertions, 21 deletions
diff --git a/apl9.h b/apl9.h
index 01738e6..ce30be9 100644
--- a/apl9.h
+++ b/apl9.h
@@ -243,6 +243,7 @@ struct ThreadData
ErrorGuard *globalerrorguard;
QLock lock;
Rendez newmail;
+ Array *name;
};
struct Mail
@@ -339,7 +340,7 @@ Function inverse(Function);
/* concurrency.c */
void initthreads(void);
-int spawnthread(Function, Array *, Array *);
+int spawnthread(Function, Array *, Array *, Array *);
ThreadData *getthreaddata(void);
void messagesend(Array *, int);
Array *messagerecv(Function, int);
@@ -438,7 +439,6 @@ Array *fnSend(Array *, Array *);
Array *opEach(Datum *, Array *, Array *);
Array *opSwitch(Datum *, Array *, Array *);
Array *opKey(Datum *, Array *, Array *);
-Array *opSpawn(Datum *, Array *, Array *);
Array *opOuterProduct(Datum *, Array *, Array *);
Array *opSelfReference1(Datum *, Array *, Array *);
Array *opReceive(Datum *, Array *, Array *);
@@ -452,6 +452,7 @@ Array *opOver(Datum *, Datum *, Array *, Array *);
Array *opUnder(Datum *, Datum *, Array *, Array *);
Array *opObverse(Datum *, Datum *, Array *, Array *);
Array *opSelfReference2(Datum *, Datum *, Array *, Array *);
+Array *opSpawn(Datum *, Datum *, Array *, Array *);
/* Dyadic functions from hybrids.c */
Array *fnReplicateLast(Array *, Array *);
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);
diff --git a/operators.c b/operators.c
index 5359a54..20c8611 100644
--- a/operators.c
+++ b/operators.c
@@ -4,15 +4,14 @@
#include "apl9.h"
-Rune primmonopnames[] = L"¨⍨⌸⌶&⌾∆⍇";
-Rune primdyadopnames[] = L"⍣.∘⍤⍥@⍠⌺⍢⍫⍙";
+Rune primmonopnames[] = L"¨⍨⌸⌶⌾∆⍇";
+Rune primdyadopnames[] = L"⍣.∘⍤⍥@⍠⌺⍢⍫⍙&";
opmonad monadoperatordefs[] = {
opEach, /* ¨ */
opSwitch, /* ⍨ */
opKey, /* ⌸ */
0, /* ⌶ */
- opSpawn, /* & */
opOuterProduct, /* ⌾ */
opSelfReference1, /* ∆ */
opReceive, /* ⍇ */
@@ -30,6 +29,7 @@ opdyad dyadoperatordefs[] = {
opUnder, /* ⍢ */
opObverse, /* ⍫ */
opSelfReference2, /* ⍙ */
+ opSpawn, /* & */
};
/* Monadic operators */
@@ -94,15 +94,6 @@ opKey(Datum *lefto, Array *left, Array *right)
}
Array *
-opSpawn(Datum *lefto, Array *left, Array *right)
-{
- if(lefto->tag != FunctionTag)
- throwerror(L"Can only spawn functions", ESyntax);
- int id = spawnthread(lefto->func, left, right);
- return mkscalarint(id);
-}
-
-Array *
opOuterProduct(Datum *lefto, Array *left, Array *right)
{
if(left == nil)
@@ -370,4 +361,17 @@ opSelfReference2(Datum *lefto, Datum *righto, Array *left, Array *right)
throwerror(nil, ESyntax);
return nil;
}
+}
+
+Array *
+opSpawn(Datum *lefto, Datum *righto, Array *left, Array *right)
+{
+ if(lefto->tag != FunctionTag)
+ throwerror(L"Can only spawn functions", ESyntax);
+ if(righto->tag != ArrayTag
+ || GetType(righto->array) != AtypeRune
+ || GetRank(righto->array) != 1)
+ throwerror(L"Thread name must be a character vector", EDomain);
+ int id = spawnthread(lefto->func, righto->array, left, right);
+ return mkscalarint(id);
} \ No newline at end of file