您的位置:首页 > 其它

内存管理: malloc()与free()的一种基于池表结构的实现

2012-05-04 18:44 330 查看
/**
* Initialize this module.
*
* Carves out memp_memory into linked lists for each pool-type.
*/
void
memp_init(void)
{
struct memp *memp;
u16_t i, j;

memp = LWIP_MEM_ALIGN(memp_memory);
/* for every pool: */
for (i = 0; i < MEMP_MAX; ++i) {
memp_tab[i] = NULL;
/* create a linked list of memp elements */
for (j = 0; j < memp_num[i]; ++j) {
memp->next = memp_tab[i];
memp_tab[i] = memp;
memp = (struct memp *)((u8_t *)memp + MEMP_SIZE + memp_sizes[i]);
}
}
}

/**
* Get an element from a specific pool.
*
* @param type the pool to get an element from
*
* the debug version has two more parameters:
* @param file file name calling this function
* @param line number of line where this function is called
*
* @return a pointer to the allocated memory or a NULL pointer on error
*/
void *
memp_malloc(memp_t type)
{
struct memp *memp;

SYS_ARCH_DECL_PROTECT(old_level);

SYS_ARCH_PROTECT(old_level);

memp = memp_tab[type];

if (memp != NULL) {
memp_tab[type] = memp->next;
memp = (struct memp*)((u8_t*)memp + MEMP_SIZE);
} else {
MEMP_STATS_INC(err, type);
}

SYS_ARCH_UNPROTECT(old_level);

return memp;
}

/**
* Put an element back into its pool.
*
* @param type the pool where to put mem
* @param mem the memp element to free
*/
void
memp_free(memp_t type, void *mem)
{
struct memp *memp;

SYS_ARCH_DECL_PROTECT(old_level);

if (mem == NULL) return;
memp = (struct memp *)((u8_t*)mem - MEMP_SIZE);

SYS_ARCH_PROTECT(old_level);

memp->next = memp_tab[type];
memp_tab[type] = memp;

SYS_ARCH_UNPROTECT(old_level);
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐