diff options
Diffstat (limited to 'memory.c')
-rw-r--r-- | memory.c | 42 |
1 files changed, 11 insertions, 31 deletions
@@ -2,6 +2,7 @@ #include <libc.h> #include <bio.h> #include <pool.h> +#include <thread.h> #include "apl9.h" @@ -56,18 +57,13 @@ freearray(Array *a) { if(a == nil) return; - if(GetRefs(a) == 0){ - print("NEGATIVE REF COUNT (array)! %p\n", a); - exits(nil); - } - SetRefs(a, GetRefs(a)-1); - if(GetRefs(a) == 0){ + if(decref(a) == 0){ if(GetType(a) == AtypeArray){ - for(int i = 0; i < GetSize(a); i++) + for(int i = 0; i < a->size; i++) freearray(a->arraydata[i]); } - if(GetType(a) == AtypeArray && GetSize(a) == 0) + if(GetType(a) == AtypeArray && a->size == 0) freearray(a->prototype); else free(a->rawdata); @@ -83,26 +79,20 @@ allocarray(arrayDataType t, int rank, int size) Array *a = emalloc(sizeof(Array)); SetRank(a, rank); SetType(a, t); - SetSize(a, size); SetStrand(a, 0); - SetRefs(a, 1); + a->ref = 1; + a->size = size; a->shape = emalloc(sizeof(*a->shape) * rank); a->rawdata = emalloc(datasizes[t] * size); arrayalloccounts++; return a; } -void -incarrayref(Array *a) -{ - SetRefs(a, GetRefs(a)+1); -} - Datum * allocdatum(int tag, int shy) { Datum *d = emallocz(sizeof(Datum), 1); - d->refs = 1; + d->ref = 1; d->tag = tag; d->shy = shy; datumalloccounts++; @@ -115,8 +105,7 @@ freedatum(Datum *d) if(d == nil) return; - d->refs--; - if(d->refs == 0){ + if(decref(d)){ /* print("FREE DATUM: %S\n", ppdatum(d)); */ switch(d->tag){ case ArrayTag: @@ -151,19 +140,10 @@ freedatum(Datum *d) } free(d); datumalloccounts--; - }else if(d->refs < 0){ - print("NEGATIVE REF COUNT (datum)! %p\n", d); - exits(nil); } } void -incdatumref(Datum *d) -{ - d->refs++; -} - -void freefunction(Function f) { freearray(f.left); @@ -225,7 +205,7 @@ dupfunction(Function f) { Function g = f; if(g.left) - incarrayref(g.left); + incref(g.left); switch(f.type){ case FunctypeDfn: @@ -261,9 +241,9 @@ dupoperator(Operator o) Operator p = o; if(p.left) - incdatumref(p.left); + incref(p.left); if(p.right) - incdatumref(p.right); + incref(p.right); switch(o.type){ case OperatortypeDop: p.dop = runestrdup(o.dop); |