Add "base_len" to memory arena so that bootstrap arena doesn't delete itself
This commit is contained in:
13
code/arena.c
13
code/arena.c
@@ -68,17 +68,14 @@ MA_StaticFunc uint8_t *MV__AdvanceCommit(MV_Memory *m, size_t *commit_size, size
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
MA_API void MA_DeallocateStub(MA_Arena *arena, void *p) {}
|
|
||||||
|
|
||||||
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos) {
|
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos) {
|
||||||
pos = MA_CLAMP_TOP(pos, arena->len);
|
MA_ASSERT(arena->len >= arena->base_len);
|
||||||
|
pos = MA_CLAMP(pos, arena->base_len, arena->len);
|
||||||
arena->len = pos;
|
arena->len = pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
MA_API void *MA_PopSize(MA_Arena *arena, size_t size) {
|
MA_API void MA_PopSize(MA_Arena *arena, size_t size) {
|
||||||
size = MA_CLAMP_TOP(size, arena->len);
|
MA_PopToPos(arena, arena->len - size);
|
||||||
arena->len -= size;
|
|
||||||
return arena->memory.data + arena->len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MA_API void MA_DeallocateArena(MA_Arena *arena) {
|
MA_API void MA_DeallocateArena(MA_Arena *arena) {
|
||||||
@@ -153,6 +150,7 @@ MA_API MA_Arena *MA_Bootstrap(void) {
|
|||||||
MA_Arena bootstrap_arena = {0};
|
MA_Arena bootstrap_arena = {0};
|
||||||
MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena);
|
MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena);
|
||||||
*arena = bootstrap_arena;
|
*arena = bootstrap_arena;
|
||||||
|
arena->base_len = arena->len;
|
||||||
return arena;
|
return arena;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -160,6 +158,7 @@ MA_API M_Allocator MA_BootstrapExclusive(void) {
|
|||||||
MA_Arena bootstrap_arena = {0};
|
MA_Arena bootstrap_arena = {0};
|
||||||
MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena);
|
MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena);
|
||||||
*arena = bootstrap_arena;
|
*arena = bootstrap_arena;
|
||||||
|
arena->base_len = arena->len;
|
||||||
return MA_GetExclusiveAllocator(arena);
|
return MA_GetExclusiveAllocator(arena);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,8 @@ struct MA_Arena {
|
|||||||
MV_Memory memory;
|
MV_Memory memory;
|
||||||
int alignment;
|
int alignment;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
size_t base_len; // When popping to 0 this is the minimum "len" value
|
||||||
|
// It's so that Bootstrapped arena won't delete itself when Reseting.
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
operator M_Allocator() { return {this, MA_AllocatorProc}; }
|
operator M_Allocator() { return {this, MA_AllocatorProc}; }
|
||||||
@@ -130,9 +132,8 @@ MA_API MA_Checkpoint MA_Save(MA_Arena *arena);
|
|||||||
MA_API void MA_Load(MA_Checkpoint checkpoint);
|
MA_API void MA_Load(MA_Checkpoint checkpoint);
|
||||||
|
|
||||||
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos);
|
MA_API void MA_PopToPos(MA_Arena *arena, size_t pos);
|
||||||
MA_API void * MA_PopSize(MA_Arena *arena, size_t size);
|
MA_API void MA_PopSize(MA_Arena *arena, size_t size);
|
||||||
MA_API void MA_DeallocateArena(MA_Arena *arena);
|
MA_API void MA_DeallocateArena(MA_Arena *arena);
|
||||||
MA_API void MA_DeallocateStub(MA_Arena *arena, void *p);
|
|
||||||
MA_API void MA_Reset(MA_Arena *arena);
|
MA_API void MA_Reset(MA_Arena *arena);
|
||||||
|
|
||||||
MA_API void MA_MemoryZero(void *p, size_t size);
|
MA_API void MA_MemoryZero(void *p, size_t size);
|
||||||
|
|||||||
@@ -1,5 +1,25 @@
|
|||||||
#include "../core.c"
|
#include "../core.c"
|
||||||
|
|
||||||
|
void TestBootstrapArenaClear() {
|
||||||
|
MA_Arena *arena = MA_Bootstrap();
|
||||||
|
IO_Assert(arena->base_len != 0);
|
||||||
|
|
||||||
|
MA_PushSize(arena, 1024);
|
||||||
|
MA_Reset(arena);
|
||||||
|
|
||||||
|
int *vals = MA_PushArray(arena, int, 1024);
|
||||||
|
for (int i = 0; i < 1024; i += 1) {
|
||||||
|
vals[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
int *a = MA_PushStruct(arena, int);
|
||||||
|
*a = 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < 1024; i += 1) {
|
||||||
|
IO_Assert(vals[i] == i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void TestScratch() {
|
void TestScratch() {
|
||||||
MA_Arena *scratch_arena_test = NULL;
|
MA_Arena *scratch_arena_test = NULL;
|
||||||
{
|
{
|
||||||
@@ -76,4 +96,5 @@ int main() {
|
|||||||
TestCreateAllocate();
|
TestCreateAllocate();
|
||||||
TestBootstrap();
|
TestBootstrap();
|
||||||
TestBootstrapExclusive();
|
TestBootstrapExclusive();
|
||||||
|
TestBootstrapArenaClear();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user