From 7fea236618f7b7fdb445fba3b6c1d88aede85c58 Mon Sep 17 00:00:00 2001 From: Abdelrahman Date: Sat, 14 Sep 2024 17:27:33 +0100 Subject: [PATCH] Implement reallocation functionality for Arena allocator --- src/core/mem/arena/mem_arena.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/core/mem/arena/mem_arena.c b/src/core/mem/arena/mem_arena.c index fd6eb8d..8d115c3 100644 --- a/src/core/mem/arena/mem_arena.c +++ b/src/core/mem/arena/mem_arena.c @@ -96,11 +96,37 @@ void *wapp_mem_arena_alloc_aligned(Arena *arena, u64 size, u64 alignment) { } void *wapp_mem_arena_realloc(Arena *arena, void *ptr, u64 old_size, u64 new_size) { - return NULL; + if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset || + arena->offset + new_size >= arena->buf + arena->capacity) { + return NULL; + } + + void *new_ptr = wapp_mem_arena_alloc(arena, new_size); + if (!new_ptr) { + return NULL; + } + + u64 copy_size = new_size <= old_size ? new_size : old_size; + memcpy(new_ptr, ptr, copy_size); + + return new_ptr; } void *wapp_mem_arena_realloc_aligned(Arena *arena, void *ptr, u64 old_size, u64 new_size, u64 alignment) { - return NULL; + if ((u8*)ptr < arena->buf || (u8*)ptr > arena->offset || + arena->offset + new_size >= arena->buf + arena->capacity) { + return NULL; + } + + void *new_ptr = wapp_mem_arena_alloc_aligned(arena, new_size, alignment); + if (!new_ptr) { + return NULL; + } + + u64 copy_size = new_size <= old_size ? new_size : old_size; + memcpy(new_ptr, ptr, copy_size); + + return new_ptr; } void wapp_mem_arena_clear(Arena *arena) {