diff options
Diffstat (limited to 'prb_arena.h')
-rw-r--r-- | prb_arena.h | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/prb_arena.h b/prb_arena.h index 2d3453f..0a6de9b 100644 --- a/prb_arena.h +++ b/prb_arena.h @@ -1,6 +1,48 @@ -#define PRB_DEFAULT_ALLOC_SIZE KB(4) +#define DEFAULT_ARENA_SIZE kilobytes(4) -Arena *alloc_arena(U64 cap); -void release_arena(Arena *a); -void *push_arena(Arena *a, U64 size); -void pop_arena(Arena *a, U64 size); +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); +} |