Add bootstrap exclusive arena

This commit is contained in:
Krzosa Karol
2023-12-31 19:41:49 +01:00
parent 49068c9818
commit 3d074ce0ac
3 changed files with 39 additions and 5 deletions

16
arena.c
View File

@@ -156,6 +156,13 @@ MA_API MA_Arena *MA_Bootstrap(void) {
return arena;
}
MA_API M_Allocator MA_BootstrapExclusive(void) {
MA_Arena bootstrap_arena = {0};
MA_Arena *arena = MA_PushStruct(&bootstrap_arena, MA_Arena);
*arena = bootstrap_arena;
return MA_GetExclusiveAllocator(arena);
}
MA_API void MA_InitFromBuffer(MA_Arena *arena, void *buffer, size_t size) {
arena->memory.data = (uint8_t *)buffer;
arena->memory.commit = size;
@@ -285,10 +292,11 @@ MA_API void *MA_AllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size
MA_API void *MA_ExclusiveAllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size) {
MA_Arena *arena = (MA_Arena *)allocator;
if (kind == M_AllocatorOp_Reallocate) {
if (size > arena->len) {
size_t size_to_push = size - arena->len;
MA_PushSizeNonZeroed(arena, size_to_push);
return arena->memory.data;
if (size > old_size) {
size_t size_to_push = size - old_size;
void *result = MA_PushSizeNonZeroed(arena, size_to_push);
if (!p) p = result;
return p;
}
}

View File

@@ -116,9 +116,10 @@ MA_API void MA_InitEx(MA_Arena *a, size_t reserve);
MA_API void MA_Init(MA_Arena *a);
MA_API MA_Arena MA_Create();
MA_API void MA_MakeSureInitialized(MA_Arena *a);
MA_API MA_Arena * MA_Bootstrap(void);
MA_API void MA_InitFromBuffer(MA_Arena *arena, void *buffer, size_t size);
MA_API MA_Arena MA_MakeFromBuffer(void *buffer, size_t size);
MA_API MA_Arena * MA_Bootstrap(void);
MA_API M_Allocator MA_BootstrapExclusive(void);
MA_API MA_Arena MA_PushArena(MA_Arena *arena, size_t size);
MA_API void * MA_PushSizeNonZeroed(MA_Arena *a, size_t size);
@@ -154,6 +155,7 @@ MA_API void * M_Alloc(M_Allocator allocator, size_t size);
MA_API void * M_AllocCopy(M_Allocator allocator, void *p, size_t size);
MA_API void * M_ReallocNonZeroed(M_Allocator allocator, void *p, size_t size, size_t old_size);
MA_API void M_Dealloc(M_Allocator allocator, void *p);
MA_API M_Allocator M_GetSystemAllocator(void);
MA_API M_Allocator MA_GetExclusiveAllocator(MA_Arena *arena);
MA_API M_Allocator MA_GetAllocator(MA_Arena *arena);

View File

@@ -48,8 +48,32 @@ void TestCreateAllocate() {
MA_DeallocateArena(&created_arena);
}
void TestBootstrap() {
MA_Arena *arena = MA_Bootstrap();
void *r0 = MA_PushSize(arena, 1024);
void *r1 = MA_PushSize(arena, 1024);
IO_Assert(arena->len >= 2048);
IO_Assert(r0 != r1);
MA_DeallocateArena(arena);
}
void TestBootstrapExclusive() {
Array<int> v = {MA_BootstrapExclusive()};
v.add(0);
int *ptr = &v[0];
for (int i = 1; i < 1000; i += 1) {
IO_Assert(&v[0] == ptr);
v.add(i);
}
int i = 0;
For(v) IO_Assert(it == i++);
v.dealloc();
}
int main() {
TestScratch();
TestBuffer();
TestCreateAllocate();
TestBootstrap();
TestBootstrapExclusive();
}