From df03b483197aef4488bfdc3ca6ceb61aa1e706ea Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Wed, 30 Sep 2026 22:24:46 +0100 Subject: [PATCH] Update allocator interface --- CHANGELOG.md | 10 +++++++ VERSION | 2 +- src/base/mem/allocator/mem_allocator.c | 24 +++++++++++++++ src/base/mem/allocator/mem_allocator.h | 30 ++++++++++++------- src/os/allocators/arena/mem_arena_allocator.c | 27 +++++++++-------- src/os/allocators/arena/mem_arena_allocator.h | 2 -- tests/allocator/test_allocator.c | 6 ++-- tests/allocator/test_allocator.cc | 6 ++-- 8 files changed, 75 insertions(+), 32 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b66227..af8f0c4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.0.0] - 2026-09-30 + +### Added + +- `temp_begin` and `temp_end` ops to the `WpAllocator` interface + +### Removed + +- `wpMemArenaAllocatorTempBegin` and `wpMemArenaAllocatorTempEnd` + ## [2.6.0] - 2026-09-30 ### Changed diff --git a/VERSION b/VERSION index e70b452..4a36342 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.6.0 +3.0.0 diff --git a/src/base/mem/allocator/mem_allocator.c b/src/base/mem/allocator/mem_allocator.c index b62c692..107637d 100644 --- a/src/base/mem/allocator/mem_allocator.c +++ b/src/base/mem/allocator/mem_allocator.c @@ -56,6 +56,26 @@ void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size) { allocator->free(ptr, size, allocator->obj); } +void wpMemAllocatorTempBegin(const WpAllocator *allocator) { + wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); + + if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_TEMP_BEGIN)) { + return; + } + + allocator->temp_begin(allocator->obj); +} + +void wpMemAllocatorTempEnd(const WpAllocator *allocator) { + wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); + + if (!wpMemAllocatorOpSupported(allocator, WP_MEM_OP_TEMP_END)) { + return; + } + + allocator->temp_end(allocator->obj); +} + b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op) { wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); @@ -70,6 +90,10 @@ b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op) { return allocator->realloc_aligned != NULL; case WP_MEM_OP_FREE: return allocator->free != NULL; + case WP_MEM_OP_TEMP_BEGIN: + return allocator->temp_begin != NULL; + case WP_MEM_OP_TEMP_END: + return allocator->temp_end != NULL; default: break; } diff --git a/src/base/mem/allocator/mem_allocator.h b/src/base/mem/allocator/mem_allocator.h index d023133..eea284b 100644 --- a/src/base/mem/allocator/mem_allocator.h +++ b/src/base/mem/allocator/mem_allocator.h @@ -17,24 +17,30 @@ typedef enum WpMemOp { WP_MEM_OP_REALLOC, WP_MEM_OP_REALLOC_ALIGNED, WP_MEM_OP_FREE, + WP_MEM_OP_TEMP_BEGIN, + WP_MEM_OP_TEMP_END, COUNT_MEM_OPS } WpMemOp; -typedef void *(WpMemAllocFunc)(u64 size, void *alloc_obj); -typedef void *(WpMemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj); -typedef void *(WpMemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj); -typedef void *(WpMemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj); -typedef void (WpMemFreeFunc)(void **ptr, u64 size, void *alloc_obj); +typedef void *(WpMemAllocFunc)(u64 size, void *alloc_obj); +typedef void *(WpMemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj); +typedef void *(WpMemReallocFunc)(void *ptr, u64 old_size, u64 new_size, void *alloc_obj); +typedef void *(WpMemReallocAlignedFunc)(void *ptr, u64 old_size, u64 new_size, u64 alignment, void *alloc_obj); +typedef void (WpMemFreeFunc)(void **ptr, u64 size, void *alloc_obj); +typedef void (WpMemTempBeginFunc)(void *alloc_obj); +typedef void (WpMemTempEndFunc)(void *alloc_obj); typedef struct WpAllocator WpAllocator; struct WpAllocator { - void *obj; - WpMemAllocFunc *alloc; - WpMemAllocAlignedFunc *alloc_aligned; - WpMemReallocFunc *realloc; + void *obj; + WpMemAllocFunc *alloc; + WpMemAllocAlignedFunc *alloc_aligned; + WpMemReallocFunc *realloc; WpMemReallocAlignedFunc *realloc_aligned; - WpMemFreeFunc *free; + WpMemFreeFunc *free; + WpMemTempBeginFunc *temp_begin; + WpMemTempEndFunc *temp_end; }; #ifdef WP_PLATFORM_CPP @@ -50,8 +56,10 @@ void *wpMemAllocatorAlloc(const WpAllocator *allocator, u64 size); void *wpMemAllocatorAllocAligned(const WpAllocator *allocator, u64 size, u64 alignment); void *wpMemAllocatorRealloc(const WpAllocator *allocator, void *ptr, u64 old_size, u64 new_size); void *wpMemAllocatorReallocAligned(const WpAllocator *allocator, void *ptr, u64 old_size, - u64 new_size, u64 alignment); + u64 new_size, u64 alignment); void wpMemAllocatorFree(const WpAllocator *allocator, void **ptr, u64 size); +void wpMemAllocatorTempBegin(const WpAllocator *allocator); +void wpMemAllocatorTempEnd(const WpAllocator *allocator); b8 wpMemAllocatorOpSupported(const WpAllocator *allocator, WpMemOp op); #ifdef WP_PLATFORM_CPP diff --git a/src/os/allocators/arena/mem_arena_allocator.c b/src/os/allocators/arena/mem_arena_allocator.c index d36877c..1c77c64 100644 --- a/src/os/allocators/arena/mem_arena_allocator.c +++ b/src/os/allocators/arena/mem_arena_allocator.c @@ -2,7 +2,6 @@ #include "mem_arena_allocator.h" #include "mem_arena.h" -#include "../../mem/mem_os.h" #include "../../../common/aliases/aliases.h" #include "../../../common/assert/assert.h" @@ -11,7 +10,9 @@ wp_intern void *memArenaAlloc(u64 size, void *alloc_obj); wp_intern void *memArenaAllocAligned(u64 size, u64 alignment, void *alloc_obj); wp_intern void *memArenaRealloc(void *ptr, u64 old_size, u64 new_size, void *alloc_obj); wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u64 alignment, - void *alloc_obj); + void *alloc_obj); +wp_intern void memArenaTempBegin(void *alloc_obj); +wp_intern void memArenaTempEnd(void *alloc_obj); WpAllocator wpMemArenaAllocatorInitWithBuffer(u8 *buffer, u64 buffer_size) { WpAllocator allocator = {0}; @@ -37,16 +38,6 @@ WpAllocator wpMemArenaAllocatorInitCustom(u64 base_capacity, WpMemAllocFlags fla return allocator; } -void wpMemArenaAllocatorTempBegin(const WpAllocator *allocator) { - wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); - wpMemArenaTempBegin((WpArena *)(allocator->obj)); -} - -void wpMemArenaAllocatorTempEnd(const WpAllocator *allocator) { - wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); - wpMemArenaTempEnd((WpArena *)(allocator->obj)); -} - void wpMemArenaAllocatorClear(WpAllocator *allocator) { wpDebugAssert(allocator != NULL, "`allocator` should not be NULL"); wpMemArenaClear((WpArena *)(allocator->obj)); @@ -63,6 +54,8 @@ wp_intern void initialiseArenaAllocator(WpAllocator *allocator) { allocator->alloc_aligned = memArenaAllocAligned; allocator->realloc = memArenaRealloc; allocator->realloc_aligned = memArenaReallocAligned; + allocator->temp_begin = memArenaTempBegin; + allocator->temp_end = memArenaTempEnd; } wp_intern void *memArenaAlloc(u64 size, void *alloc_obj) { @@ -85,3 +78,13 @@ wp_intern void *memArenaReallocAligned(void *ptr, u64 old_size, u64 new_size, u6 WpArena *arena = (WpArena *)alloc_obj; return wpMemArenaReallocAligned(arena, ptr, old_size, new_size, alignment); } + +wp_intern void memArenaTempBegin(void *alloc_obj) { + WpArena *arena = (WpArena *)alloc_obj; + wpMemArenaTempBegin(arena); +} + +wp_intern void memArenaTempEnd(void *alloc_obj) { + WpArena *arena = (WpArena *)alloc_obj; + wpMemArenaTempEnd(arena); +} diff --git a/src/os/allocators/arena/mem_arena_allocator.h b/src/os/allocators/arena/mem_arena_allocator.h index 789cbb2..13bc7df 100644 --- a/src/os/allocators/arena/mem_arena_allocator.h +++ b/src/os/allocators/arena/mem_arena_allocator.h @@ -34,8 +34,6 @@ BEGIN_C_LINKAGE */ WpAllocator wpMemArenaAllocatorInitCustom(u64 base_capacity, WpMemAllocFlags flags, b8 zero_buffer); WpAllocator wpMemArenaAllocatorInitWithBuffer(u8 *buffer, u64 buffer_size); -void wpMemArenaAllocatorTempBegin(const WpAllocator *allocator); -void wpMemArenaAllocatorTempEnd(const WpAllocator *allocator); void wpMemArenaAllocatorClear(WpAllocator *allocator); void wpMemArenaAllocatorDestroy(WpAllocator *allocator); diff --git a/tests/allocator/test_allocator.c b/tests/allocator/test_allocator.c index 525d1b7..523e5cf 100644 --- a/tests/allocator/test_allocator.c +++ b/tests/allocator/test_allocator.c @@ -7,7 +7,7 @@ #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {0}; -wp_intern WpAllocator temp_allocator = {0}; +wp_intern WpAllocator temp_allocator = {0}; WpTestFuncResult test_arena_allocator(void) { WpAllocator allocator = wpMemArenaAllocatorInit(4096); @@ -45,7 +45,7 @@ WpTestFuncResult test_arena_allocator_temp_begin(void) { i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); b8 result = num1 != NULL; - wpMemArenaAllocatorTempBegin(&temp_allocator); + wpMemAllocatorTempBegin(&temp_allocator); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); result = result && num2 != NULL; i32 *num3 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); @@ -55,7 +55,7 @@ WpTestFuncResult test_arena_allocator_temp_begin(void) { } WpTestFuncResult test_arena_allocator_temp_end(void) { - wpMemArenaAllocatorTempEnd(&temp_allocator); + wpMemAllocatorTempEnd(&temp_allocator); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); b8 result = num1 != NULL; i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); diff --git a/tests/allocator/test_allocator.cc b/tests/allocator/test_allocator.cc index 35b8b80..d678599 100644 --- a/tests/allocator/test_allocator.cc +++ b/tests/allocator/test_allocator.cc @@ -7,7 +7,7 @@ #define TEMP_BUF_SIZE (40 + sizeof(i32) * 8) wp_intern u8 temp_buf[TEMP_BUF_SIZE] = {}; -wp_intern WpAllocator temp_allocator = {}; +wp_intern WpAllocator temp_allocator = {}; WpTestFuncResult test_arena_allocator(void) { WpAllocator allocator = wpMemArenaAllocatorInit(4096); @@ -45,7 +45,7 @@ WpTestFuncResult test_arena_allocator_temp_begin(void) { i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); b8 result = num1 != NULL; - wpMemArenaAllocatorTempBegin(&temp_allocator); + wpMemAllocatorTempBegin(&temp_allocator); i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); result = result && num2 != NULL; i32 *num3 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); @@ -55,7 +55,7 @@ WpTestFuncResult test_arena_allocator_temp_begin(void) { } WpTestFuncResult test_arena_allocator_temp_end(void) { - wpMemArenaAllocatorTempEnd(&temp_allocator); + wpMemAllocatorTempEnd(&temp_allocator); i32 *num1 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32)); b8 result = num1 != NULL; i32 *num2 = (i32 *)wpMemAllocatorAlloc(&temp_allocator, sizeof(i32));