Arena *arena_alloc(U64 cap) { Arena *arena = 0; /* TODO(pryazha): Use OS related memory allocator (like VirtualAlloc on Windows) */ arena = malloc(sizeof(Arena)); Assert(arena); if (!cap) cap = DEFAULT_ALLOC_SIZE; arena->mem = malloc(cap); Assert(arena->mem); arena->cap = cap; arena->used = 0; return arena; } void arena_release(Arena *arena) { free(arena->mem); arena->mem = 0; arena->cap = 0; arena->used = 0; free(arena); } void *arena_push(Arena *arena, U64 size) { Assert(arena->used+size <= arena->cap); void *r = arena->mem+arena->used; arena->used += size; return r; } void arena_pop(Arena *arena, U64 amount) { Assert(arena); U64 clamped = ClampTop(amount, arena->used); arena->used = arena->used-clamped; }