From 5b8e9f8be6c24ae6552f0f8764146523dde3697f Mon Sep 17 00:00:00 2001 From: Abdelrahman Said Date: Sun, 24 Mar 2024 19:25:07 +0000 Subject: [PATCH] Wrap libc memory functions in Allocator interface --- mem/include/libc/mem_libc.h | 15 ++++++++++++ mem/src/libc/mem_libc.c | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 mem/include/libc/mem_libc.h create mode 100644 mem/src/libc/mem_libc.c diff --git a/mem/include/libc/mem_libc.h b/mem/include/libc/mem_libc.h new file mode 100644 index 0000000..608821c --- /dev/null +++ b/mem/include/libc/mem_libc.h @@ -0,0 +1,15 @@ +#ifndef MEM_LIBC_H +#define MEM_LIBC_H + +#include "mem_allocator.h" +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +Allocator wapp_mem_libc_allocator(void); + +#ifdef __cplusplus +} +#endif // __cplusplus + +#endif // !MEM_LIBC_H diff --git a/mem/src/libc/mem_libc.c b/mem/src/libc/mem_libc.c new file mode 100644 index 0000000..c482b8b --- /dev/null +++ b/mem/src/libc/mem_libc.c @@ -0,0 +1,46 @@ +#include "mem_libc.h" +#include "aliases.h" +#include "mem_allocator.h" +#include +#include + +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); + +Allocator wapp_mem_libc_allocator(void) { + return (Allocator){ + .obj = NULL, + .alloc = mem_libc_alloc, + .alloc_aligned = mem_libc_alloc_aligned, + .realloc = mem_libc_realloc, + .realloc_aligned = NULL, + .free = mem_libc_free, + }; +} + +internal void *mem_libc_alloc(u64 size, void *alloc_obj) { + return calloc(1, size); +} + +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); + } + + return output; +} + +internal void *mem_libc_realloc(void *ptr, u64 size, void *alloc_obj) { + void *output = realloc(ptr, size); + if (output) { + memset(output, 0, size); + } + + return output; +} + +internal void mem_libc_free(void *ptr, void *alloc_obj) { free(ptr); }