diff options
Diffstat (limited to 'prb_memory.c')
-rw-r--r-- | prb_memory.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/prb_memory.c b/prb_memory.c new file mode 100644 index 0000000..4bceccc --- /dev/null +++ b/prb_memory.c @@ -0,0 +1,42 @@ +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; +} |