57 lines
1.1 KiB
C
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;
|
|
}
|