lwip内存池:
文件:memp.c memp.h memp_std.h
#define LWIP_MEMPOOL_DECLARE(name,num,size,desc)
LWIP_DECLARE_MEMORY_ALIGNED(memp_memory_ ## name ## base, ((num) * (MEMP_SIZE + MEMP_ALIGN_SIZE(size))));
LWIP_MEMPOOL_DECLARE_STATS_INSTANCE(memp_stats ## name)
static struct memp *memp_tab_ ## name;
const struct memp_desc memp_ ## name = {
DECLARE_LWIP_MEMPOOL_DESC(desc)
LWIP_MEMPOOL_DECLARE_STATS_REFERENCE(memp_stats_ ## name)
LWIP_MEM_ALIGN_SIZE(size),
(num),
memp_memory_ ## name ## base,
&memp_tab ## name
};
#define LWIP_MEMPOOL(name,num,size,desc) LWIP_MEMPOOL_DECLARE(name,num,size,desc)
#include “lwip/priv/memp_std.h”
以上在memp.c 声明了各种内存池 每种内存池有num个内存池 基地址由描述符base记录。所以在编译时内存已经分配好了就是全局变量。
const struct memp_desc *const memp_pools[MEMP_MAX] = {
#define LWIP_MEMPOOL(name,num,size,desc) &memp_ ## name,
#include “lwip/priv/memp_std.h”
};
将各种内存池的描述符地址组成数组。
/** Memory pool descriptor */
struct memp_desc {
#if defined(LWIP_DEBUG) || MEMP_OVERFLOW_CHECK || LWIP_STATS_DISPLAY
/** Textual description /
const char desc;
/ Element size */
u16_t size;
#if !MEMP_MEM_MALLOC
/** Number of elements */
u16_t num;
/** Base address */
u8_t *base;
/** First free element of each pool. Elements form a linked list. */
struct memp **tab;/指向此类空闲内存池的链表头
#endif / MEMP_MEM_MALLOC */
};
/**
- Initialize custom memory pool.
- Related functions: memp_malloc_pool, memp_free_pool
- @param desc pool to initialize
*/
void
memp_init_pool(const struct memp_desc *desc)
{
int i;
struct memp *memp;
*desc->tab = NULL;
memp = (struct memp )LWIP_MEM_ALIGN(desc->base);
#if MEMP_MEM_INIT
/ force memset on pool memory /
memset(memp, 0, (size_t)desc->num * (MEMP_SIZE + desc->size ));
#endif
/ create a linked list of memp elements */
for (i = 0; i < desc->num; ++i) {
memp->next = *desc->tab;
*desc->tab = memp;
/* cast through void* to get rid of alignment warnings */
memp = (struct memp *)(void *)((u8_t *)memp + MEMP_SIZE + desc->size );
}
}
memp_init_pool将已经分配好的内存池空间 一共num个初始化成链表。
如上分配好的内存被初始化为链表 链表尾的next指针指向NULL。
分配出去的pool从链表移除,并将tab指向重新空闲的链表头。
free pool的时候将其重新加入链表头。