diff --git a/mem/include/allocator/mem_allocator.h b/mem/include/allocator/mem_allocator.h index 51ac8b2..44f4751 100644 --- a/mem/include/allocator/mem_allocator.h +++ b/mem/include/allocator/mem_allocator.h @@ -12,11 +12,11 @@ typedef void *(MemAllocAlignedFunc)(u64 size, u64 alignment, void *alloc_obj); typedef void *(MemReallocFunc)(void *ptr, u64 size, void *alloc_obj); typedef void *(MemReallocAlignedFunc)(void *ptr, u64 size, u64 alignment, void *alloc_obj); -typedef void(MemFreeFunc)(void *ptr, void *alloc_obj); +typedef void(MemFreeFunc)(void **ptr, void *alloc_obj); typedef struct allocator Allocator; struct allocator { - void *obj; + void *obj; MemAllocFunc *alloc; MemAllocAlignedFunc *alloc_aligned; MemReallocFunc *realloc; @@ -24,6 +24,15 @@ struct allocator { MemFreeFunc *free; }; +void *wapp_mem_allocator_alloc(const Allocator *allocator, u64 size); +void *wapp_mem_allocator_alloc_aligned(const Allocator *allocator, u64 size, + u64 alignment); +void *wapp_mem_allocator_realloc(const Allocator *allocator, void *ptr, + u64 size); +void *wapp_mem_allocator_realloc_aligned(const Allocator *allocator, void *ptr, + u64 size, u64 alignment); +void wapp_mem_allocator_free(const Allocator *allocator, void **ptr); + #ifdef __cplusplus } #endif // __cplusplus diff --git a/mem/src/arena/mem_arena.c b/mem/src/arena/mem_arena.c index 25c2f23..f7e07ff 100644 --- a/mem/src/arena/mem_arena.c +++ b/mem/src/arena/mem_arena.c @@ -51,7 +51,8 @@ internal void base_arena_free(BaseArena *arena); internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr); internal void *mem_arena_alloc(u64 size, void *alloc_obj); -internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj); +internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, + void *alloc_obj); internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj); internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment, void *alloc_obj); @@ -374,26 +375,27 @@ internal ArenaAllocHDR *find_alloc_header(BaseArena *arena, void *alloc_ptr) { } internal void *mem_arena_alloc(u64 size, void *alloc_obj) { - Arena *arena = (Arena *)alloc_obj; + Arena *arena = (Arena *)alloc_obj; - return wapp_mem_arena_alloc(arena, size); + return wapp_mem_arena_alloc(arena, size); } -internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) { - Arena *arena = (Arena *)alloc_obj; +internal void *mem_arena_alloc_aligned(u64 size, u64 alignment, + void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; - return wapp_mem_arena_alloc_aligned(arena, size, alignment); + return wapp_mem_arena_alloc_aligned(arena, size, alignment); } internal void *mem_arena_realloc(void *ptr, u64 size, void *alloc_obj) { - Arena *arena = (Arena *)alloc_obj; + Arena *arena = (Arena *)alloc_obj; - return wapp_mem_arena_realloc(arena, ptr, size); + return wapp_mem_arena_realloc(arena, ptr, size); } internal void *mem_arena_realloc_aligned(void *ptr, u64 size, u64 alignment, - void *alloc_obj) { - Arena *arena = (Arena *)alloc_obj; + void *alloc_obj) { + Arena *arena = (Arena *)alloc_obj; - return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment); + return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment); } diff --git a/mem/src/ctx/mem_ctx.c b/mem/src/ctx/mem_ctx.c index 4cef187..e95c48c 100644 --- a/mem/src/ctx/mem_ctx.c +++ b/mem/src/ctx/mem_ctx.c @@ -18,7 +18,7 @@ internal Arena *get_arena(CTXDestBuffer buffer); Allocator wapp_mem_ctx_allocator(CTXDestBuffer buffer) { Arena *arena = get_arena(buffer); - return wapp_mem_arena_allocator(arena); + return wapp_mem_arena_allocator(arena); } void wapp_mem_ctx_init(u64 main_buf_capacity, u64 temp_buf_capacity) { @@ -53,17 +53,17 @@ void *wapp_mem_ctx_realloc(CTXDestBuffer buffer, void *ptr, u64 size) { return NULL; } - return wapp_mem_arena_realloc(arena, ptr, size); + return wapp_mem_arena_realloc(arena, ptr, size); } void *wapp_mem_ctx_realloc_aligned(CTXDestBuffer buffer, void *ptr, u64 size, - u64 alignment) { + u64 alignment) { Arena *arena = get_arena(buffer); if (!arena) { return NULL; } - return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment); + return wapp_mem_arena_realloc_aligned(arena, ptr, size, alignment); } void wapp_mem_ctx_clear(CTXDestBuffer buffer) { diff --git a/mem/src/libc/mem_libc.c b/mem/src/libc/mem_libc.c index c482b8b..7add62f 100644 --- a/mem/src/libc/mem_libc.c +++ b/mem/src/libc/mem_libc.c @@ -7,7 +7,7 @@ internal void *mem_libc_alloc(u64 size, void *alloc_obj); internal void *mem_libc_alloc_aligned(u64 size, u64 alignment, void *alloc_obj); internal void *mem_libc_realloc(void *ptr, u64 size, void *alloc_obj); -internal void mem_libc_free(void *ptr, void *alloc_obj); +internal void mem_libc_free(void **ptr, void *alloc_obj); Allocator wapp_mem_libc_allocator(void) { return (Allocator){ @@ -26,10 +26,10 @@ internal void *mem_libc_alloc(u64 size, void *alloc_obj) { internal void *mem_libc_alloc_aligned(u64 size, u64 alignment, void *alloc_obj) { - void *output = aligned_alloc(alignment, size); - if (output) { - memset(output, 0, size); - } + void *output = aligned_alloc(alignment, size); + if (output) { + memset(output, 0, size); + } return output; } @@ -43,4 +43,11 @@ internal void *mem_libc_realloc(void *ptr, u64 size, void *alloc_obj) { return output; } -internal void mem_libc_free(void *ptr, void *alloc_obj) { free(ptr); } +internal void mem_libc_free(void **ptr, void *alloc_obj) { + if (!ptr || !(*ptr)) { + return; + } + + free(*ptr); + *ptr = NULL; +}