diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-02-08 16:03:10 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-02-08 16:03:10 +0000 |
commit | c6e1c83f93f63a061f0804821ed29c656da38f28 (patch) | |
tree | 8f3b8863d9db2d79722a4ec104bb2eeb807f87e0 /symbol.c | |
parent | 511ae2c1879676568b2f11312c38a66b2caa21c0 (diff) |
Add work in progress concurrency. Might break stuff!
Diffstat (limited to 'symbol.c')
-rw-r--r-- | symbol.c | 60 |
1 files changed, 34 insertions, 26 deletions
@@ -1,11 +1,11 @@ #include <u.h> #include <libc.h> +#include <thread.h> #include <bio.h> #include "apl9.h" Symtab *globalsymtab; -DfnFrame *currentdfn; Symtab *newsymtab(void); void freesymtab(Symtab *); @@ -20,7 +20,8 @@ void setsyntaxerr(Datum); Symbol * getsym(Rune *name, int fresh) { - DfnFrame *dfn = currentdfn; + ThreadData *td = getthreaddata(); + DfnFrame *dfn = td->currentdfn; Symtab *tab; int done = 0; do{ @@ -28,10 +29,10 @@ getsym(Rune *name, int fresh) tab = dfn->symtab; else tab = globalsymtab; - - for(int i = 0; i < tab->nsyms; i++) + for(int i = 0; i < tab->nsyms; i++){ if(runestrcmp(tab->syms[i]->name, name) == 0) return tab->syms[i]; + } if(dfn) dfn = dfn->prev; else @@ -39,8 +40,8 @@ getsym(Rune *name, int fresh) }while(!done && !fresh); /* make sure to allocate in the most local scope if the symbol is not found */ - if(currentdfn) - tab = currentdfn->symtab; + if(td->currentdfn) + tab = td->currentdfn->symtab; tab->nsyms++; tab->syms = realloc(tab->syms, sizeof(Symbol *) * tab->nsyms); @@ -106,12 +107,14 @@ initsymtab(void) DfnFrame * getcurrentdfn(void) { - return currentdfn; + ThreadData *td = getthreaddata(); + return td->currentdfn; } DfnFrame * pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right) { + ThreadData *td = getthreaddata(); DfnFrame *new = malloc(sizeof(DfnFrame)); new->code = code; new->symtab = newsymtab(); @@ -124,27 +127,29 @@ pushdfnframe(Rune *code, Datum *lefto, Datum *righto, Array *left, Array *right) }else new->left = nil; new->right = right; - new->prev = currentdfn; - currentdfn = new; + new->prev = td->currentdfn; + td->currentdfn = new; return new; } void popdfnframe(void) { - if(currentdfn != nil){ - DfnFrame *prev = currentdfn->prev; - freesymtab(currentdfn->symtab); - free(currentdfn); - currentdfn = prev; + ThreadData *td = getthreaddata(); + if(td->currentdfn != nil){ + DfnFrame *prev = td->currentdfn->prev; + freesymtab(td->currentdfn->symtab); + free(td->currentdfn); + td->currentdfn = prev; } } vlong globalIO(void) { - if(currentdfn) - return currentdfn->symtab->io; + ThreadData *td = getthreaddata(); + if(td->currentdfn) + return td->currentdfn->symtab->io; else if(globalsymtab) return globalsymtab->io; else @@ -154,8 +159,9 @@ globalIO(void) void globalIOset(vlong io) { - if(currentdfn) - currentdfn->symtab->io = io; + ThreadData *td = getthreaddata(); + if(td->currentdfn) + td->currentdfn->symtab->io = io; else globalsymtab->io = io; } @@ -163,8 +169,9 @@ globalIOset(vlong io) int globalDIV(void) { - if(currentdfn) - return currentdfn->symtab->div; + ThreadData *td = getthreaddata(); + if(td->currentdfn) + return td->currentdfn->symtab->div; else if(globalsymtab) return globalsymtab->div; else @@ -174,8 +181,9 @@ globalDIV(void) void globalDIVset(int div) { - if(currentdfn) - currentdfn->symtab->div = div; + ThreadData *td = getthreaddata(); + if(td->currentdfn) + td->currentdfn->symtab->div = div; else globalsymtab->div = div; } @@ -192,7 +200,7 @@ getalpha(void) res = malloc(sizeof(Datum)); *res = *dfn->left; if(res->tag == ArrayTag) - incref(res->array); + incarrayref(res->array); return res; } return res; @@ -209,7 +217,7 @@ getomega(void) res = mallocz(sizeof(Datum), 1); res->tag = ArrayTag; res->array = dfn->right; - incref(res->array); + incarrayref(res->array); } return res; } @@ -225,7 +233,7 @@ getalphao(void) res = malloc(sizeof(Datum)); *res = *dfn->lefto; if(res->tag == ArrayTag) - incref(res->array); + incarrayref(res->array); } return res; } @@ -241,7 +249,7 @@ getomegao(void) res = malloc(sizeof(Datum)); *res = *dfn->righto; if(res->tag == ArrayTag) - incref(res->array); + incarrayref(res->array); } return res; } |