From 5976d6b5a6b85c9e92290a2752d57f1f47910541 Mon Sep 17 00:00:00 2001 From: kilroy <> Date: Sun, 30 Nov 2025 22:37:18 -0500 Subject: [PATCH] Added basic arena implementation w/ linear allocator --- include/arena.h | 27 +++++++++++++++++++ src/arena.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 include/arena.h create mode 100644 src/arena.c diff --git a/include/arena.h b/include/arena.h new file mode 100644 index 0000000..bcef97a --- /dev/null +++ b/include/arena.h @@ -0,0 +1,27 @@ +#ifndef ARENA_H +#define ARENA_H + +#include + +typedef struct { + uint8_t *buffer; + size_t capacity; + size_t offset; +} Arena; + +Arena *ArenaInit(size_t capacity); +void ArenaDestroy(Arena *arena); + +void *ArenaAlloc(Arena *arena, size_t size); +void *ArenaAllocZero(Arena *arena, size_t size); + +void ArenaFree(Arena *arena, size_t size); +void ArenaFreeAndNullify(Arena *arena, size_t size, void **ptrAddress); + +// Fundamentally returns how many bytes have been allocated +size_t ArenaGetOffset(Arena *arena); + +void ArenaSetOffsetBack(Arena *arena, size_t offset); +void ArenaClear(Arena *arena); + +#endif // ARENA_H \ No newline at end of file diff --git a/src/arena.c b/src/arena.c new file mode 100644 index 0000000..1d02d68 --- /dev/null +++ b/src/arena.c @@ -0,0 +1,69 @@ +#include "../include/arena.h" + +//#include +#include +#include + +Arena *ArenaInit(size_t capacity) +{ + Arena arena; + arena.buffer = malloc(capacity); + arena.capacity = capacity; + arena.offset = 0; + return &arena; +} + +void ArenaDestroy(Arena *arena) +{ + free(arena->buffer); + arena->buffer = NULL; + arena->capacity = 0; + arena->offset = 0; +} + +void *ArenaAlloc(Arena *arena, size_t size) +{ + void *ptr = arena->buffer + arena->offset; + arena->offset += size; + return ptr; +} +void *ArenaAllocZero(Arena *arena, size_t size) +{ + void *ptr = arena->buffer + arena->offset; + arena->offset += size; + // should I just use memset? + for (void *i = ptr; i != ptr + size; ++i) { + *(uint8_t*)i = 0; + } + return ptr; +} + +void ArenaFree(Arena *arena, size_t size) +{ + arena->offset -= size; +} + +// Frees the memory in the arena *and* sets the pointer to null +void ArenaFreeAndNullify(Arena *arena, size_t size, void **ptrAddress) +{ + arena->offset -= size; + *ptrAddress = NULL; +} + +// Fundamentally returns how many bytes have been allocated +size_t ArenaGetOffset(Arena *arena) +{ + return arena->offset; +} + +void ArenaSetOffsetBack(Arena *arena, size_t offset) +{ + if (offset > arena->offset) { + *(int*)0 = 0; // Should crash here + } + arena->offset = offset; +} +void ArenaClear(Arena *arena) +{ + arena->offset = 0; +} \ No newline at end of file