From c6e1c83f93f63a061f0804821ed29c656da38f28 Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Tue, 8 Feb 2022 16:03:10 +0000 Subject: Add work in progress concurrency. Might break stuff! --- quadnames.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'quadnames.c') diff --git a/quadnames.c b/quadnames.c index 5632cd4..7d5884c 100644 --- a/quadnames.c +++ b/quadnames.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "apl9.h" @@ -16,6 +17,7 @@ Datum *getdiv(void); void setdiv(Datum); Datum *geta(void); Datum *getd(void); +Datum *getself(void); Array *runfile(Array *); Array *quadthrow1(Array *); @@ -23,9 +25,11 @@ Array *quadthrow2(Array *, Array *); Array *quadinfo(Array *); Array *quadproto(Array *); Array *quaducs(Array *); +Array *quaddl(Array *); int needsnewline = 0; static Rune *quadquotebuf = nil; +static Lock quadlock; QuadnameDef quadnames[] = { {L"⍞", NameTag, getquotequad, setquotequad, nil, nil}, @@ -35,11 +39,13 @@ QuadnameDef quadnames[] = { {L"⎕DIV", NameTag, getdiv, setdiv, nil, nil}, {L"⎕A", NameTag, geta, nil, nil, nil}, {L"⎕D", NameTag, getd, nil, nil, nil}, + {L"⎕SELF", NameTag, getself, nil, nil, nil}, {L"⎕RUN", FunctionTag, nil, nil, runfile, nil}, {L"⎕THROW", FunctionTag, nil, nil, quadthrow1, quadthrow2}, {L"⎕INFO", FunctionTag, nil, nil, quadinfo, nil}, {L"⎕PROTO", FunctionTag, nil, nil, quadproto, nil}, {L"⎕UCS", FunctionTag, nil, nil, quaducs, nil}, + {L"⎕DL", FunctionTag, nil, nil, quaddl, nil}, {nil, 0, nil, nil, nil, nil} /* MUST BE LAST */ }; @@ -88,6 +94,7 @@ quadnamedatum(QuadnameDef q) Datum * getquotequad(void) { + lock(&quadlock); int sizemax = 512; int size; Rune *input; @@ -114,12 +121,14 @@ getquotequad(void) result->tag = ArrayTag; result->array = mkrunearray(input); free(input); + unlock(&quadlock); return result; } void setquotequad(Datum new) { + lock(&quadlock); Rune *str = ppdatum(new); if(needsnewline && quadquotebuf != nil){ if(quadquotebuf){ @@ -135,6 +144,7 @@ setquotequad(Datum new) needsnewline = 1; print("%S", str); free(str); + unlock(&quadlock); } /* ⎕ */ @@ -150,8 +160,10 @@ getquad(void) void setquad(Datum new) { + lock(&quadlock); needsnewline = 0; print("%S\n", ppdatum(new)); + unlock(&quadlock); } /* ⎕IO */ @@ -231,6 +243,17 @@ getd(void) return d; } +/* ⎕SELF */ +Datum * +getself(void) +{ + Datum *d = mallocz(sizeof(Datum), 1); + d->tag = ArrayTag; + d->array = mkscalarint(threadid()); + return d; +} + + /* ⎕RUN */ Array * runfile(Array *a) @@ -337,4 +360,23 @@ quaducs(Array *a) }else throwerror(nil, EType); return res; +} + +/* ⎕DL */ +Array * +quaddl(Array *a) +{ + /* TODO: return amount of seconds slept */ + if(a->size != 1) + throwerror(nil, ELength); + if(a->type != AtypeInt && a->type != AtypeFloat) + throwerror(nil, EType); + + if(a->type == AtypeInt && a->intdata[0] >= 0) + sleep(a->intdata[0] * 1000); + else if(a->type == AtypeFloat && a->floatdata[0] >= 0) + sleep(a->floatdata[0] * 1000); + else + throwerror(nil, EDomain); + return fnSame(a); } \ No newline at end of file -- cgit v1.2.3