diff --git a/include/nuttx/mm/mempool.h b/include/nuttx/mm/mempool.h index 3138fc9250b..d27741f13f4 100644 --- a/include/nuttx/mm/mempool.h +++ b/include/nuttx/mm/mempool.h @@ -36,6 +36,12 @@ * Public Types ****************************************************************************/ +struct mempool_s; +typedef CODE void *(*mempool_alloc_t)(FAR struct mempool_s *pool, + size_t size); +typedef CODE void (*mempool_free_t)(FAR struct mempool_s *pool, + FAR void *addr); + #ifndef CONFIG_FS_PROCFS_EXCLUDE_MEMPOOL struct mempool_procfs_entry_s { @@ -53,6 +59,8 @@ struct mempool_s size_t ninterrupt; /* The number of block in interrupt mempool */ size_t nexpand; /* The number of expand block every time for mempool */ bool wait; /* The flag of need to wait when mempool is empty */ + mempool_alloc_t alloc; /* The alloc function for mempool */ + mempool_free_t free; /* The free function for mempool */ /* Private data for memory pool */ diff --git a/mm/mempool/mempool.c b/mm/mempool/mempool.c index ab4b42cbb09..1b8d764c317 100644 --- a/mm/mempool/mempool.c +++ b/mm/mempool/mempool.c @@ -41,6 +41,30 @@ static inline void mempool_add_list(FAR sq_queue_t *list, FAR void *base, } } +static inline FAR void *mempool_malloc(FAR struct mempool_s *pool, size_t size) +{ + if (pool->alloc != NULL) + { + return pool->alloc(pool, size); + } + else + { + return kmm_malloc(size); + } +} + +static inline void mempool_mfree(FAR struct mempool_s *pool, FAR void *addr) +{ + if (pool->free != NULL) + { + return pool->free(pool, addr); + } + else + { + return kmm_free(addr); + } +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -81,7 +105,8 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name) { FAR sq_entry_t *base; - base = kmm_malloc(sizeof(*base) + pool->bsize * count); + base = mempool_malloc(pool, sizeof(*base) + + pool->bsize * count); if (base == NULL) { return -ENOMEM; @@ -152,7 +177,8 @@ retry: spin_unlock_irqrestore(&pool->lock, flags); if (pool->nexpand != 0) { - blk = kmm_malloc(sizeof(*blk) + pool->bsize * pool->nexpand); + blk = mempool_malloc(pool, sizeof(*blk) + pool->bsize * + pool->nexpand); if (blk == NULL) { return NULL; @@ -305,7 +331,7 @@ int mempool_deinit(FAR struct mempool_s *pool) while ((blk = sq_remfirst(&pool->elist)) != NULL) { - kmm_free(blk); + mempool_mfree(pool, blk); } if (pool->wait && pool->nexpand == 0)