这个结构的主要功能如下:

  1、管理内存块。通过cleanup和clean_tail两个指针,因为内存块在内存池中是以单链表的形式组织的,这两个指针分别指向链表的头和尾指针。

  2、内存池中可用的内存大小。通过size域来统计完成。

  3、获取新的内存块指针。通过heap指针在每次分配内存块时重新赋值来实现。

  这个内存池的实现,主要是依靠上面三个数据结构来完成,其实估计已经知道的差不多了。下面再讨论一些基本的

  三、创建一个空的内存池

  创建一个空的内存池比较简单,是初始化一个内存池结构,也是pool_t结构,并将其链表置为NULL,大小为0,不包含任何的内存块。

pool_t _pool_new()
{
    pool_t p;
    while((p = malloc(sizeof(_pool))) == NULL) sleep(1);
    p->cleanup = NULL;
    p->heap = NULL;
    p->size = 0;
    return p;
}

  四、创建指定大小的内存池

  创建一个包含大小为size内存块的内存池,这个操作分两步,先创建一个空的内存池,然后再创建一个内存块,并将该内存块加入内存池中,也是将内存块加到内存池的链表末尾,并重新设定指针。

pool_t _pool_new_heap(int size)
{
    pool_t p;
    p = _pool_new();
    p->heap = _pool_heap(p,size);
    return p;
}

  第一步是先调用_pool_new创建一个空的内存池结构,这个前面已经说明了,操作很简单。看第二步是怎么完成的

static struct pheap *_pool_heap(pool_t p, int size)
{
    struct pheap *ret;
    struct pfree *clean;

    while((ret = _pool__malloc(sizeof(struct pheap))) == NULL) sleep(1);
    while((ret->block = _pool__malloc(size)) == NULL) sleep(1);
    ret->size = size;
    p->size += size;
    ret->used = 0;

    clean = _pool_free(p, _pool_heap_free, (void *)ret);
    clean->heap = ret; /* for future use in finding used mem for pstrdup */
    _pool_cleanup_append(p, clean);

    return ret;
}

  第二步包含下面一些操作:

  1、申请一个大小为size的内存块,也是前方中介绍的pheap结构。

  2、把这个内存块的大小size,加到内存池上,是那个p->size += size;

  3、将内存块关联到struct pfree结构。这会指示内存释放的方式,也把内存加入到链表元素上。

  4、将struct pfree结构关联到内存池,其实是加到链表的末尾。

  下面会讨论第3和第4部是怎么实现的。