Add bootstrap exclusive arena
This commit is contained in:
16
arena.c
16
arena.c
@@ -156,6 +156,13 @@ MA_API MA_Arena *MA_Bootstrap(void) {
|
|||||||
return arena;
|
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) {
|
MA_API void MA_InitFromBuffer(MA_Arena *arena, void *buffer, size_t size) {
|
||||||
arena->memory.data = (uint8_t *)buffer;
|
arena->memory.data = (uint8_t *)buffer;
|
||||||
arena->memory.commit = size;
|
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_API void *MA_ExclusiveAllocatorProc(void *allocator, M_AllocatorOp kind, void *p, size_t size, size_t old_size) {
|
||||||
MA_Arena *arena = (MA_Arena *)allocator;
|
MA_Arena *arena = (MA_Arena *)allocator;
|
||||||
if (kind == M_AllocatorOp_Reallocate) {
|
if (kind == M_AllocatorOp_Reallocate) {
|
||||||
if (size > arena->len) {
|
if (size > old_size) {
|
||||||
size_t size_to_push = size - arena->len;
|
size_t size_to_push = size - old_size;
|
||||||
MA_PushSizeNonZeroed(arena, size_to_push);
|
void *result = MA_PushSizeNonZeroed(arena, size_to_push);
|
||||||
return arena->memory.data;
|
if (!p) p = result;
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
arena.h
4
arena.h
@@ -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 void MA_Init(MA_Arena *a);
|
||||||
MA_API MA_Arena MA_Create();
|
MA_API MA_Arena MA_Create();
|
||||||
MA_API void MA_MakeSureInitialized(MA_Arena *a);
|
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 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_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 MA_Arena MA_PushArena(MA_Arena *arena, size_t size);
|
||||||
|
|
||||||
MA_API void * MA_PushSizeNonZeroed(MA_Arena *a, 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_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_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 void M_Dealloc(M_Allocator allocator, void *p);
|
||||||
|
|
||||||
MA_API M_Allocator M_GetSystemAllocator(void);
|
MA_API M_Allocator M_GetSystemAllocator(void);
|
||||||
MA_API M_Allocator MA_GetExclusiveAllocator(MA_Arena *arena);
|
MA_API M_Allocator MA_GetExclusiveAllocator(MA_Arena *arena);
|
||||||
MA_API M_Allocator MA_GetAllocator(MA_Arena *arena);
|
MA_API M_Allocator MA_GetAllocator(MA_Arena *arena);
|
||||||
|
|||||||
@@ -48,8 +48,32 @@ void TestCreateAllocate() {
|
|||||||
MA_DeallocateArena(&created_arena);
|
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() {
|
int main() {
|
||||||
TestScratch();
|
TestScratch();
|
||||||
TestBuffer();
|
TestBuffer();
|
||||||
TestCreateAllocate();
|
TestCreateAllocate();
|
||||||
|
TestBootstrap();
|
||||||
|
TestBootstrapExclusive();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user