nginx的list数据结构

nginx的list比较简单,主要在文件src/core/ngx_list.h和src/core/ngx_list.c两个文件中,可以说是麻雀虽小,五脏俱全。

1、ngx_list的结构

其定义如下:

struct ngx_list_part_s {
    void             *elts;  //元素的首地址
    ngx_uint_t        nelts; //元素的个数
    ngx_list_part_t  *next;  //指向下一个链表块,构成链表
};

//可以认为是管理链表的单元
typedef struct {
    ngx_list_part_t  *last;    //指向list_part构成的链表的最后一个list_part
    ngx_list_part_t   part;		//表示list_part构成的链表的每一个part
    size_t            size;		//表示part中每个元素的大小 
    ngx_uint_t        nalloc;	//表示part中可以容纳最大的元素个数
    ngx_pool_t       *pool;
} ngx_list_t;

UML结构图表示为

2、ngx_list的操作

2.1 创建初始化

创建是由函数ngx_list_create来完成,当中调用了函数ngx_list_init

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->part.elts = ngx_palloc(pool, n * size);   //内存池中分配part的元素elts数组,容量为n,每个元素大小为size
    if (list->part.elts == NULL) {
        return NGX_ERROR;
    }

    list->part.nelts = 0;      //元素个数为0
    list->part.next = NULL;
    list->last = &list->part;   //将last指针指向第一个part
    list->size = size;			//初始化元素大小 
    list->nalloc = n;			//初始化容量
    list->pool = pool;		

    return NGX_OK;
}

创建初始化时的结构分布图为

2.2 向list中添加元素

添加元素是由函数ngx_list_push,其实现为

void *
ngx_list_push(ngx_list_t *l)
{
    void             *elt;
    ngx_list_part_t  *last;

    last = l->last;

	//如果list_part中的已经填充满
    if (last->nelts == l->nalloc) {

        /* the last part is full, allocate a new list part */
	
		//在内存池中申请list_part
        last = ngx_palloc(l->pool, sizeof(ngx_list_part_t));
        if (last == NULL) {
            return NULL;
        }
		
		//申请elts
        last->elts = ngx_palloc(l->pool, l->nalloc * l->size);
        if (last->elts == NULL) {
            return NULL;
        }

        last->nelts = 0;
        last->next = NULL;
		
		//设置list的last指针指向新申请的list_part,串成链表
        l->last->next = last;
        l->last = last;
    }

    elt = (char *) last->elts + l->size * last->nelts;
    last->nelts++;

    return elt;
}

list_push后的结构图为






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值