ngx_list_t为nginx定义的链表结构,与传统意义上的链表结构不同的是,ngx_list_t中的每个链表元素又挂载一块连续的内存空间。ngx_list_t中实际存储元素的位置在ngx_list_part_t中。
1. ngx_list_t的结构
typedef struct {
ngx_list_part_t *last; //指向链表最后一个元素
ngx_list_part_t part; //指向链表第一个元素
size_t size; //ngx_list_part_t中存储的单个元素的大小
ngx_uint_t nalloc; //ngx_list_part_t连续空间的容量
ngx_pool_t *pool; //内存池
} ngx_list_t;
struct ngx_list_part_s {
void *elts; //存储元素的首地址
ngx_uint_t nelts; //已存储元素个数
ngx_list_part_t *next; //指向下一个链表元素
};
2. ngx_list_t提供的接口
ngx_list_t *ngx_list_create(ngx_pool_t *pool, ngx_uint_t n, size_t size); //创建一个list
static ngx_inline ngx_int_t ngx_list_init(ngx_list_t *list, ngx_pool_t *pool, ngx_uint_t n, size_t size); //初始化一个list
void *ngx_list_push(ngx_list_t *list); //向list中添加一个元素
使用ngx_list_t之前,必须先用ngx_list_create或者ngx_list_init初始化链表。
3. ngx_list_t的遍历
part = &list->part;
v = part->elts;
for (i = 0; /* void */; i++) {
if (i >= part->nelts) {
if (part->next == NULL) {
break;
}
part = part->next;
v = part->elts;
i = 0;
}
process(&v[i]); //处理元素v[i]
}