searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

nginx关键数据结构之ngx_list_t

2023-08-03 10:03:57
23
0

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]
}

 

0条评论
0 / 1000
m****n
4文章数
0粉丝数
m****n
4 文章 | 0 粉丝
原创

nginx关键数据结构之ngx_list_t

2023-08-03 10:03:57
23
0

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]
}

 

文章来自个人专栏
nginx源码学习
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0