#define DEFAULT_ARENA_SIZE kilobytes(4) arena_t alloc_arena(u64 capacity) { void *sys_alloc(u64 length); /* TODO(pryazha): Find reasonable maximum capacity through testing */ assert(capacity <= (u64)gigabytes(16)); if (!capacity) capacity = DEFAULT_ARENA_SIZE; /* TODO(pryazha): Use OS specific memory allocator * (like VirtualAlloc on Windows or mmap on Linux) */ void *memory = sys_alloc(capacity); assert(memory); arena_t arena = {memory, capacity, 0}; return arena; } void release_arena(arena_t *arena) { void sys_free(void *memory, u64 length); assert(arena); sys_free(arena->memory, arena->capacity); arena->memory = 0; arena->capacity = 0; arena->used = 0; } void *push_arena(arena_t *arena, u64 size) { assert(arena); assert(arena->used + size <= arena->capacity); void *memory = arena->memory + arena->used; arena->used += size; return memory; } void pop_arena(arena_t *arena, u64 size) { assert(arena); arena->used -= min(size, arena->used); }