From ccc86342cdd305b53fc0c3b815f2dedd8d7c47a2 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 9 Jun 2024 01:45:29 +0100 Subject: [PATCH 1/2] Add address parameter to wapp_mem_util_alloc --- src/mem/util/mem_utils.c | 20 ++++++++++---------- src/mem/util/mem_utils.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mem/util/mem_utils.c b/src/mem/util/mem_utils.c index e642e9b..2e03581 100644 --- a/src/mem/util/mem_utils.c +++ b/src/mem/util/mem_utils.c @@ -19,7 +19,7 @@ internal const i32 access_types[] = { [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PAGE_EXECUTE_READWRITE, }; -internal inline void *alloc_windows(u64 size, MemAccess access, +internal inline void *alloc_windows(void *addr, u64 size, MemAccess access, MemAllocFlags flags); #elif defined(WAPP_PLATFORM_POSIX) #include @@ -33,7 +33,7 @@ internal const i32 access_types[] = { [WAPP_MEM_ACCESS_READ_WRITE_EXEC] = PROT_READ | PROT_WRITE | PROT_EXEC, }; -internal inline void *alloc_posix(u64 size, MemAccess access, +internal inline void *alloc_posix(void *addr, u64 size, MemAccess access, MemAllocFlags flags); #else #error "Unrecognised platform" @@ -62,17 +62,17 @@ void *wapp_mem_util_align_forward(void *ptr, u64 alignment) { return (void *)p; } -void *wapp_mem_util_alloc(u64 size, MemAccess access, MemAllocFlags flags, - MemInitType type) { +void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, + MemAllocFlags flags, MemInitType type) { #if defined(WAPP_PLATFORM_WINDOWS) // Ensure memory is committed if it's meant to be initialised if (type == WAPP_MEM_INIT_INITIALISED) { flags |= WAPP_MEM_ALLOC_COMMIT; } - void *output = alloc_windows(size, access, flags); + void *output = alloc_windows(addr, size, access, flags); #elif defined(WAPP_PLATFORM_POSIX) - void *output = alloc_posix(size, access, flags); + void *output = alloc_posix(addr, size, access, flags); #else return NULL; #endif @@ -93,14 +93,14 @@ void wapp_mem_util_free(void *ptr, u64 size) { } #ifdef WAPP_PLATFORM_WINDOWS -internal inline void *alloc_windows(u64 size, MemAccess access, +internal inline void *alloc_windows(void *addr, u64 size, MemAccess access, MemAllocFlags flags) { - return VirtualAlloc2(NULL, NULL, (SIZE_T)size, flags, access_types[access]); + return VirtualAlloc2(addr, NULL, (SIZE_T)size, flags, access_types[access]); } #endif #if defined(WAPP_PLATFORM_POSIX) -internal inline void *alloc_posix(u64 size, MemAccess access, +internal inline void *alloc_posix(void *addr, u64 size, MemAccess access, MemAllocFlags flags) { i32 alloc_flags = flags | MAP_ANON | MAP_PRIVATE; @@ -109,6 +109,6 @@ internal inline void *alloc_posix(u64 size, MemAccess access, alloc_flags |= MAP_NORESERVE; #endif - return mmap(NULL, size, access_types[access], alloc_flags, -1, 0); + return mmap(addr, size, access_types[access], alloc_flags, -1, 0); } #endif diff --git a/src/mem/util/mem_utils.h b/src/mem/util/mem_utils.h index 20c3896..e844f7f 100644 --- a/src/mem/util/mem_utils.h +++ b/src/mem/util/mem_utils.h @@ -49,8 +49,8 @@ typedef enum mem_init_type { } MemInitType; void *wapp_mem_util_align_forward(void *ptr, u64 alignment); -void *wapp_mem_util_alloc(u64 size, MemAccess access, MemAllocFlags flags, - MemInitType type); +void *wapp_mem_util_alloc(void *addr, u64 size, MemAccess access, + MemAllocFlags flags, MemInitType type); void wapp_mem_util_free(void *ptr, u64 size); #ifdef __cplusplus From cf121442308a20d9541117994e5720b6015da520 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sun, 9 Jun 2024 01:46:23 +0100 Subject: [PATCH 2/2] 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); }