summaryrefslogtreecommitdiff
path: root/arena.c
diff options
context:
space:
mode:
authorpryazha <pryadeiniv@mail.ru>2025-09-11 19:25:30 +0500
committerpryazha <pryadeiniv@mail.ru>2025-09-11 19:25:30 +0500
commit7e73843ac5873833c707687cd0ada0a3034e600c (patch)
treefbb593e9d76bedd9efae22646203430f9e0d4da2 /arena.c
parentdfda6b6e55f75cc0dd77b13b08d83d8ca3b3842f (diff)
add new filesHEADmaster
Diffstat (limited to 'arena.c')
-rw-r--r--arena.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/arena.c b/arena.c
new file mode 100644
index 0000000..03a1c1c
--- /dev/null
+++ b/arena.c
@@ -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);
+}