From cf121442308a20d9541117994e5720b6015da520 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 9 Jun 2024 01:46:23 +0100 Subject: [PATCH] Add utility macros for arena initialisation --- src/mem/arena/mem_arena.c | 13 ++++++++++++- src/mem/arena/mem_arena.h | 12 ++++++++++++ tests/arena/test_arena.c | 4 +--- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/mem/arena/mem_arena.c b/src/mem/arena/mem_arena.c index ee9fb3a..2797fb7 100644 --- a/src/mem/arena/mem_arena.c +++ b/src/mem/arena/mem_arena.c @@ -17,6 +17,7 @@ struct arena { u8 *buf; u8 *offset; u64 capacity; + bool committed; }; // PUBLIC API @@ -38,7 +39,7 @@ bool wapp_mem_arena_init(Arena **arena, u64 base_capacity, MemAllocFlags flags, : ARENA_MINIMUM_CAPACITY; arena_ptr->buf = (u8 *)wapp_mem_util_alloc( - arena_capacity, WAPP_MEM_ACCESS_READ_WRITE, flags, + NULL, arena_capacity, WAPP_MEM_ACCESS_READ_WRITE, flags, zero_buffer ? WAPP_MEM_INIT_INITIALISED : WAPP_MEM_INIT_UNINITIALISED); if (!(arena_ptr->buf)) { @@ -48,6 +49,8 @@ bool wapp_mem_arena_init(Arena **arena, u64 base_capacity, MemAllocFlags flags, arena_ptr->capacity = arena_capacity; arena_ptr->offset = arena_ptr->buf; + arena_ptr->committed = + (flags & WAPP_MEM_ALLOC_COMMIT) == WAPP_MEM_ALLOC_COMMIT; return true; } @@ -70,6 +73,14 @@ void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment) { arena->offset = output + size; +#ifdef WAPP_PLATFORM_WINDOWS + if (!(arena->committed)) { + output = (u8 *)wapp_mem_util_alloc(output, size, WAPP_MEM_ACCESS_READ_WRITE, + WAPP_MEM_ALLOC_COMMIT, + WAPP_MEM_INIT_UNINITIALISED); + } +#endif // ifdef WAPP_PLATFORM_WINDOWS + memset(output, 0, size); return (void *)output; diff --git a/src/mem/arena/mem_arena.h b/src/mem/arena/mem_arena.h index 2ace103..9b75573 100644 --- a/src/mem/arena/mem_arena.h +++ b/src/mem/arena/mem_arena.h @@ -11,6 +11,18 @@ extern "C" { typedef struct arena Arena; +#define wapp_mem_arena_init_default(arena_dptr, base_capacity) \ + (wapp_mem_arena_init(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE, \ + false)) +#define wapp_mem_arena_init_commit(arena_dptr, base_capacity) \ + (wapp_mem_arena_init(arena_dptr, base_capacity, \ + WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, false)) +#define wapp_mem_arena_init_zero(arena_dptr, base_capacity) \ + (wapp_mem_arena_init(arena_dptr, base_capacity, WAPP_MEM_ALLOC_RESERVE, true)) +#define wapp_mem_arena_init_commit_and_zero(arena_dptr, base_capacity) \ + (wapp_mem_arena_init(arena_dptr, base_capacity, \ + WAPP_MEM_ALLOC_RESERVE | WAPP_MEM_ALLOC_COMMIT, true)) + bool wapp_mem_arena_init(Arena **arena, u64 base_capacity, MemAllocFlags flags, bool zero_buffer); void *wapp_mem_arena_alloc(Arena *arena, u64 size); diff --git a/tests/arena/test_arena.c b/tests/arena/test_arena.c index ad2695c..656484a 100644 --- a/tests/arena/test_arena.c +++ b/tests/arena/test_arena.c @@ -1,7 +1,6 @@ #include "test_arena.h" #include "aliases.h" #include "mem_arena.h" -#include "mem_utils.h" #include "tester.h" #include #include @@ -13,8 +12,7 @@ internal u64 count = 20; internal i32 *array = NULL; TestFuncResult test_arena_init(void) { - bool result = wapp_mem_arena_init(&arena, ARENA_CAPACITY, - WAPP_MEM_ALLOC_RESERVE, false); + bool result = wapp_mem_arena_init_default(&arena, ARENA_CAPACITY); return TEST_RESULT(result); }