18
union header *arena[3];
20
void *allocate(unsigned long n, unsigned a) {
21
union header *new = malloc(sizeof *new + n);
23
assert(a < NELEMS(arena));
25
error("insufficient memory\n");
28
new->b.next = (void *)arena[a];
33
void deallocate(unsigned a) {
36
assert(a < NELEMS(arena));
37
for (p = arena[a]; p; p = q) {
38
q = (void *)p->b.next;
44
void *newarray(unsigned long m, unsigned long n, unsigned a) {
45
return allocate(m*n, a);
49
first[] = { { NULL }, { NULL }, { NULL } },
50
*arena[] = { &first[0], &first[1], &first[2] };
51
static struct block *freeblocks;
53
void *allocate(unsigned long n, unsigned a) {
56
assert(a < NELEMS(arena));
59
n = roundup(n, sizeof (union align));
60
while (n > ap->limit - ap->avail) {
61
if ((ap->next = freeblocks) != NULL) {
62
freeblocks = freeblocks->next;
66
unsigned m = sizeof (union header) + n + roundup(10*1024, sizeof (union align));
70
error("insufficient memory\n");
73
ap->limit = (char *)ap + m;
75
ap->avail = (char *)((union header *)ap + 1);
84
void *newarray(unsigned long m, unsigned long n, unsigned a) {
85
return allocate(m*n, a);
87
void deallocate(unsigned a) {
88
assert(a < NELEMS(arena));
89
arena[a]->next = freeblocks;
90
freeblocks = first[a].next;