动态数组结构:
struct ngx_array_s {
void *elts; //数组起始地址
ngx_uint_t nelts; //已经使用的个数
size_t size; //每个数据的大小, 即数组元素的大小
ngx_uint_t nalloc; //已经分配的数组大小
ngx_pool_t *pool; //内存池, elts的内存是从内存池中提取出来的, 在这里为了
};
创建数组
ngx_array_t *
ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size)
{
ngx_array_t *a;
a = ngx_palloc(p, sizeof(ngx_array_t)); //创建数组头
if (a == NULL)
{
return NULL;
}
a->elts = ngx_palloc(p, n * size); //从pool中分配数组的内存
if (a->elts == NULL)
{
return NULL;
}
a->nelts = 0; //置已使用数为0
a->size = size; //数组元素大小
a->nalloc = n; //数组元素个数
a->pool = p;
return a;
}
销毁数组:
销毁数组比较简单, 置pool中的pool->d.last位置,将数组的内存回收到pool中。
void
ngx_array_destroy(ngx_array_t *a)
{
ngx_pool_t *p;
p = a->pool;
//先收回数组部分
if ((u_char *) a->elts + a->size * a->nalloc == p->d.last)
{
p->d.last -= a->size * a->nalloc;
}
//收回数组头
if ((u_char *) a + sizeof(ngx_array_t) == p->d.last)
{
p->d.last = (u_char *) a;
}
}
ngx_array_push 和 ngx_array_push_n
如果数组已已满, 看看pool中是否还有空间;还有就扩大一个; 如果pool也不够用了, 则分配新的pool; 并且申请数组为原来的两倍。