summaryrefslogtreecommitdiff
path: root/memory.c
diff options
context:
space:
mode:
authorglenda <glenda@9front>2022-10-22 16:45:32 +0000
committerglenda <glenda@9front>2022-10-22 16:45:32 +0000
commita82186dab48c234c507693b166acd7c13433864a (patch)
treeeb6db255c93b1e6278e0e833e915c4c85372c84f /memory.c
parenta3b635de1753ed4ce73dabdc7e2c24dfdf77891e (diff)
Atomic reference counting
Diffstat (limited to 'memory.c')
-rw-r--r--memory.c42
1 files changed, 11 insertions, 31 deletions
diff --git a/memory.c b/memory.c
index 5dd879b..9f333e6 100644
--- a/memory.c
+++ b/memory.c
@@ -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);