#include #include #include #include "apl9.h" int alloccounts = 0; void freearray(Array *a) { if(a == nil) return; a->refs--; if(a->refs == 0){ /* print("Freeing array: %S (%p)\n", pparray(a), a); */ if(a->type == AtypeArray) for(int i = 0; i < a->size; i++) freearray(a->arraydata[i]); free(a->shape); free(a); alloccounts--; }else if(a->refs > 0){ /* print("Not freeing (refs=%d): %S (%p)\n", a->refs, pparray(a), a); */ }else{ print("NEGATIVE REF COUNT! %p\n", a); exits(nil); } } Array * allocarray(arrayDataType t, int rank, int size) { Array *a = malloc(sizeof(Array)); a->rank = rank; a->type = t; a->size = size; a->stranded = 0; a->shape = malloc(sizeof(int) * rank); a->rawdata = malloc(datasizes[t] * size); a->type = t; a->refs = 1; alloccounts++; return a; } void incref(Array *a) { /* print("INCREF %d->%d %S\n", a->refs, a->refs+1, pparray(a)); */ a->refs++; if(a->type == AtypeArray) for(int i = 0; i < a->size; i++) incref(a->arraydata[i]); }