typedef struct {
void *elts;
ngx_uint_t nelts;
size_t size;
ngx_uint_t nalloc;
ngx_pool_t *pool;
} ngx_array_t;
void *
ngx_array_push(ngx_array_t *a)
{
void *elt, *new;
size_t size;
ngx_pool_t *p;
if (a->nelts == a->nalloc) {//数组已满
size = a->size * a->nalloc;
p = a->pool;
if ((u_char *) a->elts + size == p->d.last
&& p->d.last + a->size <= p->d.end)//如果p的剩余空间>=一个数组元素的空间,就分配一个空间给数组
{
p->d.last += a->size;//调整pool的last,即修改下一次可分配空间的其实地址
a->nalloc++;
} else {
new = ngx_palloc(p, 2 * size);//申请新的空间,大小是原来的2倍,假如pool的内存不足够分配一个新的数组元素
if (new == NULL) {
return NULL;
}
ngx_memcpy(new, a->elts, size);//把原有的元素拷贝到新分配的内存区
a->elts = new;//修改数组数据区的地址,使其指向新分配的内存区
a->nalloc *= 2;//修改数组可容纳的元素个数,是原来容纳元素的2倍
}
}
elt = (u_char *) a->elts + a->size * a->nelts;//新增加元素的地址
a->nelts++;//数组中元素的个数加1
return elt;//返回新增加元素的地址
}
网友评论