From 0574f5a7c5159a2ae1d7d2182cec982509947db9 Mon Sep 17 00:00:00 2001 From: Raymaekers Luca Date: Sat, 7 Dec 2024 19:17:33 +0100 Subject: checkpoint --- arena.h | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 arena.h (limited to 'arena.h') 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 +#include +#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 -- cgit v1.2.3