diff options
author | Raymaekers Luca <raymaekers.luca@gmail.com> | 2024-12-07 19:17:33 +0100 |
---|---|---|
committer | Raymaekers Luca <luca@spacehb.net> | 2025-01-07 18:51:21 +0100 |
commit | 0574f5a7c5159a2ae1d7d2182cec982509947db9 (patch) | |
tree | 2a9678fd39bcf8ead03c7ee979caf668f2f17892 /arena.h | |
parent | 4aec2e1331650cabb966bbf24ed83f76cbbe9912 (diff) |
checkpoint
Diffstat (limited to 'arena.h')
-rw-r--r-- | arena.h | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -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 |