mm/mempool: support specifying alloc and free function
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
a01f3beefd
commit
8994c8efa2
@ -36,6 +36,12 @@
|
|||||||
* Public Types
|
* 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
|
#ifndef CONFIG_FS_PROCFS_EXCLUDE_MEMPOOL
|
||||||
struct mempool_procfs_entry_s
|
struct mempool_procfs_entry_s
|
||||||
{
|
{
|
||||||
@ -53,6 +59,8 @@ struct mempool_s
|
|||||||
size_t ninterrupt; /* The number of block in interrupt mempool */
|
size_t ninterrupt; /* The number of block in interrupt mempool */
|
||||||
size_t nexpand; /* The number of expand block every time for 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 */
|
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 */
|
/* Private data for memory pool */
|
||||||
|
|
||||||
|
@ -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
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -81,7 +105,8 @@ int mempool_init(FAR struct mempool_s *pool, FAR const char *name)
|
|||||||
{
|
{
|
||||||
FAR sq_entry_t *base;
|
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)
|
if (base == NULL)
|
||||||
{
|
{
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -152,7 +177,8 @@ retry:
|
|||||||
spin_unlock_irqrestore(&pool->lock, flags);
|
spin_unlock_irqrestore(&pool->lock, flags);
|
||||||
if (pool->nexpand != 0)
|
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)
|
if (blk == NULL)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -305,7 +331,7 @@ int mempool_deinit(FAR struct mempool_s *pool)
|
|||||||
|
|
||||||
while ((blk = sq_remfirst(&pool->elist)) != NULL)
|
while ((blk = sq_remfirst(&pool->elist)) != NULL)
|
||||||
{
|
{
|
||||||
kmm_free(blk);
|
mempool_mfree(pool, blk);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pool->wait && pool->nexpand == 0)
|
if (pool->wait && pool->nexpand == 0)
|
||||||
|
Loading…
Reference in New Issue
Block a user