summaryrefslogtreecommitdiff
path: root/memory.c
blob: fd0fec698f1639d057082e256a25f85a7e69d350 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <u.h>
#include <libc.h>
#include <bio.h>

#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]);
}