diff options
Diffstat (limited to 'arena.c')
-rw-r--r-- | arena.c | 38 |
1 files changed, 38 insertions, 0 deletions
@@ -0,0 +1,38 @@ +#include "arena.h" +#include "macros.h" +#include "sys.h" + +struct arena alloc_arena(u64 capacity) +{ + /* TODO(pryazha): Find reasonable maximum capacity through testing */ + assert(capacity <= (u64)gigabytes(16)); + if (!capacity) + capacity = kilobytes(4); + void *memory = sys_alloc(capacity); + assert(memory); + return (struct arena){memory, capacity, 0}; +} + +void release_arena(struct arena *arena) +{ + assert(arena); + sys_free(arena->memory, arena->capacity); + arena->memory = 0; + arena->capacity = 0; + arena->used = 0; +} + +void *push_arena(struct arena *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(struct arena *arena, u64 size) +{ + assert(arena); + arena->used -= min(size, arena->used); +} |