fix arena bugs

This commit is contained in:
Matthew 2025-09-27 20:40:36 +10:00
parent fe1a04d3b4
commit 6e1952eab0

35
alloc.d
View File

@ -24,13 +24,13 @@ struct ArenaPool
{ {
u8* mem; u8* mem;
u64 pos; u64 pos;
u64 length;
} }
struct Arena struct Arena
{ {
SLList!(ArenaPool) pools; SLList!(ArenaPool) pools;
u64 pool_length; u64 def_size;
u64 length;
} }
struct TempArena struct TempArena
@ -107,11 +107,10 @@ Arena
CreateArena(u64 size) CreateArena(u64 size)
{ {
Arena arena = { Arena arena = {
length: size, def_size: size,
pool_length: size - Node!(ArenaPool).sizeof,
}; };
AddArenaPool(&arena); AddArenaPool(&arena, size);
return arena; return arena;
} }
@ -182,14 +181,15 @@ Alloc(T)(TempArena* t)
} }
void void
AddArenaPool(Arena* arena) AddArenaPool(Arena* arena, u64 size)
{ {
u8* mem = cast(u8*)MemAlloc(arena.length); u8* mem = Alloc!(u8)(size + Node!(ArenaPool).sizeof).ptr;
Node!(ArenaPool)* node = cast(Node!(ArenaPool)*)mem; Node!(ArenaPool)* node = cast(Node!(ArenaPool)*)mem;
node.value.mem = (cast(u8*)mem) + Node!(ArenaPool).sizeof; node.value.mem = (cast(u8*)mem) + Node!(ArenaPool).sizeof;
node.value.pos = 0; node.value.pos = 0;
node.value.length = size;
assert(node.value.mem != null, "Unable to allocate memory for arena"); assert(node.value.mem != null, "Unable to allocate memory for arena");
@ -229,8 +229,6 @@ Alloc(T)(Arena* arena)
void* void*
AllocAlign(Arena* arena, u64 size, u64 alignment) AllocAlign(Arena* arena, u64 size, u64 alignment)
{ {
assert(size <= arena.pool_length, "Unable to allocate memory within arena size");
void* ptr = null; void* ptr = null;
uintptr mem_pos, current, offset; uintptr mem_pos, current, offset;
@ -239,7 +237,12 @@ AllocAlign(Arena* arena, u64 size, u64 alignment)
{ {
if(node == null) if(node == null)
{ {
AddArenaPool(arena); if(size > arena.def_size)
{
size += arena.def_size;
}
AddArenaPool(arena, Max(size, arena.def_size));
node = arena.pools.first; node = arena.pools.first;
} }
@ -247,7 +250,7 @@ AllocAlign(Arena* arena, u64 size, u64 alignment)
current = mem_pos + node.value.pos; current = mem_pos + node.value.pos;
offset = AlignPow2(current, alignment) - mem_pos; offset = AlignPow2(current, alignment) - mem_pos;
if(offset+size <= arena.pool_length) if(offset+size <= node.value.length)
{ {
break; break;
} }
@ -278,7 +281,7 @@ Free(Arena* arena)
Node!(ArenaPool)* node = arena.pools.first; Node!(ArenaPool)* node = arena.pools.first;
while (node != null) while (node != null)
{ {
MemFree(node.value.mem, arena.length); Free(node);
node = node.next; node = node.next;
} }
} }
@ -328,6 +331,7 @@ ScratchAllocCopy(T)(T[] target)
} }
unittest unittest
{
{ {
u64[5] arr = [1, 2, 3, 4, 5]; u64[5] arr = [1, 2, 3, 4, 5];
@ -335,3 +339,10 @@ unittest
assert(arr == copy); assert(arr == copy);
} }
{
Arena a = CreateArena(64);
u64[] arr = Alloc!(u64)(&a, 128);
}
}