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

来源:互联网 发布:热点设置软件 编辑:程序博客网 时间:2024/05/16 01:53
/** * Initialize this module. *  * Carves out memp_memory into linked lists for each pool-type. */voidmemp_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 */voidmemp_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);}


 

原创粉丝点击