以注释的方式记录一下。
如有错误和建议欢迎留言。
current_free_index:这个值表示的是分配器当前还能接收的内存大小。
max_free_index:这个值表示分配器最大可以接收的内存大小。
在整个内存池的设计上,是有父子层次结构的,并且分配器可以为多个内存池使用,考虑这样一种情况,多个内存池从一个分配器中向系统申请了大量内存,其中几个内存池生命周期结束被销毁,则节点都归还给分配器,此时只要分配器所属的内存池不释放就会有大量内存滞留在分配器中,这样显然是不合适的。上面2个值的作用就是限制分配器可以存放的内存数量,多余的内存都还给系统。
APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t in_size)
从pool中分配size大小的内存。
{
apr_memnode_t *active, *node; //active指向当前内存池中活跃的(已使用)节点,node指向分配内存的节点。
void *mem; //返回的内存块指针
apr_size_t size, free_index;
//将size内存对其,并判断合法性。
size = APR_ALIGN_DEFAULT(in_size);
if (size < in_size) {
if (pool->abort_fn)
pool->abort_fn(APR_ENOMEM);
return NULL;
}
active = pool->active;
define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8)
使in_size8字节对齐,方便后续的内存的计算。
ps:没想出来这个计算会有错误的结果。
/* If the active node has enough bytes left, use it. */
//如果当前活跃的节点中足够,则从活跃的节点中分配内存返回。
if (size <= node_free_space(active)) {
mem = active->first_avail;
active->first_avail += size;
return mem;
}
//判断active链表第二个节点是否有足够空闲内存(第二个是有可能比第一个空闲内存大的),
//当active链表中的节点没有足够空闲内存时,从分配器中分配内存。
node = active->next;
if (size <= node_free_space(node)) {
list_remove(node);
}
else {