#include #include #include typedef struct chunk { struct chunk *next; char *limit; char *avail; } Chunk; Chunk first = { NULL, NULL, NULL }; Chunk *arena = &first; void *arena_getmem(n) int n; { char *q; char *p = arena->avail; n = (n + 3) & ~3; /* ensuring alignment to 4 bytes */ q = p + n; if (q <= arena->limit) { arena->avail = q; return p; } { Chunk *ap = arena; Chunk *np = ap->next; while (np) { char *v = sizeof(Chunk) + (char *) np; if (v + n <= np->limit) { np->avail = v + n; arena = np; return v; } ap = np; np = ap->next; } { int m = n + 10000; np = (Chunk *) malloc(m); np->limit = m + (char *) np; np->avail = n + sizeof(Chunk) + (char *) np; np->next = NULL; ap->next = np; arena = np; return sizeof(Chunk) + (char *) np; } } } void arena_free() { arena = &first; }