
1 函数签名ngx_list_push 函数 定义在 ./nginx-1.24.0/src/core/ngx_list.cvoid*ngx_list_push(ngx_list_t*l){void*elt;ngx_list_part_t*last;lastl-last;if(last-neltsl-nalloc){/* the last part is full, allocate a new list part */lastngx_palloc(l-pool,sizeof(ngx_list_part_t));if(lastNULL){returnNULL;}last-eltsngx_palloc(l-pool,l-nalloc*l-size);if(last-eltsNULL){returnNULL;}last-nelts0;last-nextNULL;l-last-nextlast;l-lastlast;}elt(char*)last-eltsl-size*last-nelts;last-nelts;returnelt;}ngx_list_push 函数的作用是 在 Nginx 的数组链表 ngx_list_t 尾部追加一个新元素 返回该元素的内存指针供调用者初始化。 若链表尾部存储块已满它会自动从内存池分配新的存储块并链接到链表 确保元素始终能添加到末尾。2 详解1 函数签名void*ngx_list_push(ngx_list_t*l)返回值 返回值类型void * 通用指针 表示函数不限定元素的具体类型只负责返回一段可用的内存地址 调用者需要将返回值强制转换为实际元素类型的指针 返回指向新元素的内存地址参数1 ngx_list_t *l 指向要使用的 ngx_list_t 结构体的指针。2 逻辑流程1 局部变量 2 获取链表尾节点 3 尾节点已满 4 计算新元素内存地址1 局部变量{void*elt;ngx_list_part_t*last;2 获取链表尾节点lastl-last;3 尾节点已满if(last-neltsl-nalloc){/* the last part is full, allocate a new list part */lastngx_palloc(l-pool,sizeof(ngx_list_part_t));if(lastNULL){returnNULL;}last-eltsngx_palloc(l-pool,l-nalloc*l-size);if(last-eltsNULL){returnNULL;}last-nelts0;last-nextNULL;l-last-nextlast;l-lastlast;}#1 获取链表的尾节点指针存入 last#2 判断当前尾节点是否已满 last-nelts 是该节点已使用的元素个数 l-nalloc 是每个节点能容纳的最大元素数。 两者相等表示节点内数组无空位必须分配新节点 不等则可直接在当前节点追加。这是扩容的触发条件。从内存池分配一个新的节点为新节点分配存储元素的实际数组空间初始化新节点的已用元素计数为 0 将新节点的 next 指针置为 NULL将原尾节点的 next 指针指向新节点 更新链表的 last 指针使其指向新节点经过这一步l-last 就指向了新分配的、有空位的尾节点。 之后追加元素就直接用这个新节点。此操作保证了 l-last 始终指向最后一个节点4 计算新元素内存地址elt(char*)last-eltsl-size*last-nelts;last-nelts;returnelt;}计算出新元素在节点数组中的准确起始地址。 l-size * last-nelts 是当前节点中已使用元素占用的总字节数 正好是新元素写入的起始偏移。 相加得到新元素的指针 elt。 节点已用元素计数加 1 返回新元素的指针