From 4cabd4fbed3201a428fa9978e6e3e0a5bdb74100 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20O=2E=20Sel=C3=A5sdal?= Date: Thu, 4 Jun 2026 16:20:59 +0200 Subject: [PATCH] Start arena --- src/arena.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++ src/arena.h | 34 ++++++++++++++++++++++ src/base_core.h | 2 +- 3 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/arena.c create mode 100644 src/arena.h diff --git a/src/arena.c b/src/arena.c new file mode 100644 index 0000000..3fdb9d3 --- /dev/null +++ b/src/arena.c @@ -0,0 +1,76 @@ +#include "arena.h" +#include "base_core.h" +#include +// +//note(nos) Move to platrofm layer +static void *memory_allocate(size_t sz) +{ + return malloc(sz); +} + +static void memory_release(void *mem) +{ + free(mem); +} + +Arena *arena_alloc_(const ArenaParams *params) +{ + // Note: only backend now is malloc + Assert(params.size > ARENA_HEADER_SZ); + void *base = memory_allocate(params->size); + Assert(base != NULL); + + Arena *arena = (Arena *)base; + arena->current = arena; + arena->size = params->size; + arena->pos = ARENA_HEADER_SZ; + arena->prev = NULL; + + return arena; +} + + +void arena_free(Arena *arena) +{ + Arena *it = arena->current; + Arena *prev = NULL; + + while (it != NULL) { + prev = it->prev; + memory_release(it); + it = prev; + } +} + + + +void *arena_push(Arena *arena, U32 size, U32 align) +{ + Arena *current = arena->current; + U32 start_pos = AlignUpPow2(arena->pos, align); + U32 available = current->size - start_pos; + + if (available > size) { + + U8 *mem = ¤t->base[start_pos]; + arena->pos = start_pos + size; + return mem; + + } else { + // Note: We could hunt for a previous arena that still have room + U32 new_size = current->size; + if (new_size < size) { + new_size = size; + } + + ArenaParams new_params = {}; + new_params.flags = current->flags; + new_params.size = size + ARENA_HEADER_SZ; + Arena *new_arena = arena_alloc_(&new_params); + + new_arena->prev = current; + current->current = new_arena; + current = new_arena; + + } +} diff --git a/src/arena.h b/src/arena.h new file mode 100644 index 0000000..46a5231 --- /dev/null +++ b/src/arena.h @@ -0,0 +1,34 @@ +#pragma once +#include "base_core.h" + +typedef U32 ArenaFlags; + +typedef struct ArenaParams ArenaParams; +enum { + ArenaFlag_UseMalloc = (1 << 0), +}; +struct ArenaParams { + U32 size; + ArenaFlags flags; // No flags defined yet +}; + +typedef struct Arena Arena; +struct Arena { + Arena *current; + U8 *base; + U32 size; + U32 pos; + ArenaFlags flags; + Arena *prev; +}; + +StaticAssert(sizeof(Arena) <= 64); +#define ARENA_HEADER_SZ 64 + + +INLINE U32 arena_available(const Arena *arena) +{ + return arena->size - arena->pos; +} + + diff --git a/src/base_core.h b/src/base_core.h index a23e59d..40540a4 100644 --- a/src/base_core.h +++ b/src/base_core.h @@ -17,7 +17,7 @@ typedef uint64_t U64; typedef float F32; typedef double F64; #if defined(__FLT128_MANT_DIG__) || defined(__FLOAT128__) -typedef _Float128 F128; +typedef __float128 F128; #endif #ifdef __SIZEOF_INT128__ typedef __int128 S128;