diff options
Diffstat (limited to 'source/arena.h')
-rw-r--r-- | source/arena.h | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/source/arena.h b/source/arena.h new file mode 100644 index 0000000..8571e6c --- /dev/null +++ b/source/arena.h @@ -0,0 +1,63 @@ +#ifndef ARENA_H +#define ARENA_H + +#include <sys/mman.h> + +#include <stdint.h> +typedef uint8_t A_u8; +typedef uint16_t A_u16; +typedef uint32_t A_u32; +typedef uint64_t A_u64; +typedef int8_t A_s8; +typedef int16_t A_s16; +typedef int32_t A_s32; +typedef int64_t A_s64; +typedef A_u32 A_b32; + +// Arena Allocator +typedef struct { + void* addr; + A_u64 size; + A_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, A_u64 size); +void ArenaRelease(Arena* arena); +void* ArenaPush(Arena* arena, A_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, A_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, A_u64 size) +{ + A_u8* mem; + mem = (A_u8*)arena->addr + arena->pos; + arena->pos += size; + Assert(arena->pos <= arena->size); + return mem; +} + +#undef ARENA_IMPL +#endif // ARENA_IMPL |