summaryrefslogtreecommitdiff
path: root/prb_arena.h
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-06-15 15:28:45 +0500
committerpryazha <pryadeiniv@mail.ru>2025-06-15 15:28:45 +0500
commite7f67b450d8034b532101445035d3b199e702621 (patch)
treed1193a6044d75800266cec11776358be7270cf8b /prb_arena.h
parent92850237f42cecfeba519bc15f7f5bb7a76cde5f (diff)
windows?
Diffstat (limited to 'prb_arena.h')
-rw-r--r--prb_arena.h52
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);
+}