From 098caad33a0eb39d476276c6e93345b62351c69a Mon Sep 17 00:00:00 2001 From: Zhenlin Wang Date: Wed, 17 Sep 2025 21:23:34 +0800 Subject: [PATCH] feat allocator: added allocator argument for class templates Signed-off-by: Zhenlin Wang --- examples/allocator/guards.c | 4 +-- include/bfdev/allocator.h | 50 ++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/examples/allocator/guards.c b/examples/allocator/guards.c index 24f16ecb..505e65ab 100644 --- a/examples/allocator/guards.c +++ b/examples/allocator/guards.c @@ -25,7 +25,7 @@ test_cleanup(void) static int test_class_malloc(void) { - BFDEV_CLASS(bfdev_malloc, ptr)(TEST_SIZE); + BFDEV_CLASS(bfdev_malloc, ptr)(NULL, TEST_SIZE); if (!ptr) return 1; @@ -37,7 +37,7 @@ test_class_malloc(void) static int test_class_zalloc(void) { - BFDEV_CLASS(bfdev_zalloc, ptr)(TEST_SIZE); + BFDEV_CLASS(bfdev_zalloc, ptr)(NULL, TEST_SIZE); if (!ptr) return 1; diff --git a/include/bfdev/allocator.h b/include/bfdev/allocator.h index 724c53b7..9f03b180 100644 --- a/include/bfdev/allocator.h +++ b/include/bfdev/allocator.h @@ -127,21 +127,59 @@ bfdev_realloc_array(const bfdev_alloc_t *alloc, return bfdev_realloc(alloc, block, size * nr); } +static inline void * +bfdev_malloc_with_class(const bfdev_alloc_t *alloc, bfdev_size_t size) +{ + const bfdev_alloc_t **palloc; + + palloc = bfdev_malloc(BFDEV_NULL, sizeof(*palloc) + size); + if (bfdev_unlikely(!palloc)) + return BFDEV_NULL; + *palloc = alloc; + + return (void *)(palloc + 1); +} + +static inline void * +bfdev_zalloc_with_class(const bfdev_alloc_t *alloc, bfdev_size_t size) +{ + const bfdev_alloc_t **palloc; + + palloc = bfdev_zalloc(BFDEV_NULL, sizeof(*palloc) + size); + if (bfdev_unlikely(!palloc)) + return BFDEV_NULL; + *palloc = alloc; + + return (void *)(palloc + 1); +} + +static inline void +bfdev_free_with_class(void *block) +{ + const bfdev_alloc_t **palloc; + + if (bfdev_unlikely(!block)) + return; + + palloc = (const bfdev_alloc_t **)block - 1; + bfdev_free(*palloc, palloc); +} + BFDEV_DEFINE_CLEAN(bfdev_free, void *, if (!BFDEV_IS_INVAL(_T)) bfdev_free(BFDEV_NULL, _T); ) BFDEV_DEFINE_CLASS(bfdev_malloc, void *, - bfdev_malloc(BFDEV_NULL, size), - bfdev_free(BFDEV_NULL, _T), - bfdev_size_t size + bfdev_malloc_with_class(alloc, size), + bfdev_free_with_class(_T), + const bfdev_alloc_t *alloc, bfdev_size_t size ) BFDEV_DEFINE_CLASS(bfdev_zalloc, void *, - bfdev_zalloc(BFDEV_NULL, size), - bfdev_free(BFDEV_NULL, _T), - bfdev_size_t size + bfdev_zalloc_with_class(alloc, size), + bfdev_free_with_class(_T), + const bfdev_alloc_t *alloc, bfdev_size_t size ) BFDEV_END_DECLS