Gears-C/src/arena.c
2025-02-22 19:29:11 +11:00

57 lines
1.1 KiB
C

static Arena *CreateArena(rawptr buffer, isize length)
{
Arena *arena = (Arena *)buffer;
buffer += ARENA_HEADER_SIZE;
arena->buffer = buffer;
arena->length = length;
arena->pos = 0;
return arena;
}
static rawptr ArenaAllocAlign(Arena *arena, isize size, isize align)
{
rawptr ptr;
uintptr curr_ptr = (uintptr)arena->buffer + (uintptr)arena->pos;
uintptr offset = AlignPow2(curr_ptr, align);
offset -= (uintptr)arena->buffer;
if (offset+size <= arena->length)
{
ptr = &arena->buffer[offset];
arena->pos = offset+size;
}
else
{
Printfln("Out of memory: %d", arena->init_line_no);
Assert(0, "Memory Failure");
}
return ptr;
}
static rawptr ArenaAlloc(Arena *arena, isize size)
{
return ArenaAllocAlign(arena, size, DEFAULT_ALIGNMENT);
}
static void ArenaFree(Arena *arena)
{
arena->pos = 0;
}
static void ArenaFreeZeroed(Arena *arena)
{
MemZero(arena->buffer, arena->pos);
ArenaFree(arena);
}
static Arena * CreateArenaDebug(rawptr buffer, isize length, u32 init_line_no)
{
Arena *arena = CreateArena(buffer, length);
arena->init_line_no = init_line_no;
return arena;
}