aboutsummaryrefslogtreecommitdiff
path: root/arena.h
diff options
context:
space:
mode:
authorRaymaekers Luca <raymaekers.luca@gmail.com>2024-12-07 19:17:33 +0100
committerRaymaekers Luca <luca@spacehb.net>2025-01-07 18:51:21 +0100
commit0574f5a7c5159a2ae1d7d2182cec982509947db9 (patch)
tree2a9678fd39bcf8ead03c7ee979caf668f2f17892 /arena.h
parent4aec2e1331650cabb966bbf24ed83f76cbbe9912 (diff)
checkpoint
Diffstat (limited to 'arena.h')
-rw-r--r--arena.h53
1 files changed, 53 insertions, 0 deletions
diff --git a/arena.h b/arena.h
new file mode 100644
index 0000000..f3d21d7
--- /dev/null
+++ b/arena.h
@@ -0,0 +1,53 @@
+#ifndef ARENA_H
+#define ARENA_H
+
+#include <sys/mman.h>
+#include <stdint.h>
+#include "types.h"
+
+// Arena Allocator
+typedef struct {
+ void* addr;
+ u64 size;
+ u64 pos;
+} Arena;
+#define PushArray(arena, type, count) (type*)ArenaPush((arena), sizeof(type) * (count))
+#define PushArrayZero(arena, type, count) (type*)ArenaPushZero((arena), sizeof(type) * (count))
+#define PushStruct(arena, type) PushArray((arena), (type), 1)
+#define PushStructZero(arena, type) PushArrayZero((arena), (type), 1)
+
+void ArenaAlloc(Arena* arena, u64 size);
+void ArenaRelease(Arena* arena);
+void* ArenaPush(Arena* arena, u64 size);
+
+#endif // ARENA_H
+
+#ifdef ARENA_IMPL
+
+// Returns arena in case of success, or 0 if it failed to alllocate the memory
+void
+ArenaAlloc(Arena* arena, u64 size)
+{
+ arena->addr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
+ Assert(arena->addr != MAP_FAILED);
+ arena->pos = 0;
+ arena->size = size;
+}
+
+void
+ArenaRelease(Arena* arena)
+{
+ munmap(arena->addr, arena->size);
+}
+
+void*
+ArenaPush(Arena* arena, u64 size)
+{
+ u8* mem;
+ mem = (u8*)arena->addr + arena->pos;
+ arena->pos += size;
+ Assert(arena->pos <= arena->size);
+ return mem;
+}
+
+#endif // ARENA_IMPL