Ubuntu 下 nginx-1.24.0 源码分析 - ngx_list_init

news2025/3/5 2:39:13

ngx_list_init


定义src\core\ngx_list.h

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);
    if (list->part.elts == NULL) {
        return NGX_ERROR;
    }

    list->part.nelts = 0;
    list->part.next = NULL;
    list->last = &list->part;
    list->size = size;
    list->nalloc = n;
    list->pool = pool;

    return NGX_OK;
}

ngx_list_init 是 Nginx 中用于初始化链表结构的关键函数


函数签名

static ngx_inline ngx_int_t 
ngx_list_init(
    ngx_list_t *list, 
    ngx_pool_t *pool, 
    ngx_uint_t n, 
    size_t size
);
1. static ngx_inline
  • static
    限制函数的作用域为当前编译单元(即当前源文件),防止与其他文件中的同名函数冲突。

  • ngx_inline
    Nginx 定义的宏(通常展开为 inline),提示编译器将函数内联展开,减少函数调用开销。适用于频繁调用的小函数(如初始化、简单操作)。


2. 返回值 ngx_int_t
  • 返回值含义
    • NGX_OK(成功):初始化成功,链表可用。
    • NGX_ERROR(失败):内存分配失败

3. 参数详解
(1) ngx_list_t *list
  • 类型:指向 ngx_list_t 结构的指针。
  • 作用:需要被初始化的链表对象。
(2) ngx_pool_t *pool
  • 类型:指向 Nginx 内存池的指针。
  • 作用:为链表提供内存分配服务。
  • 意义
    • 所有链表相关的内存(包括初始数据块和后续扩展的数据块)均从该内存池分配。
    • 内存池管理简化了内存释放流程(销毁池即可回收所有内存)。
(3) ngx_uint_t n
  • 类型:Nginx 自定义的无符号整型(typedef unsigned int ngx_uint_t)。
  • 作用:指定每个数据块预分配的元素数量。
  • 影响
    • 决定初始内存块的大小为 n * size
    • 值过大会浪费内存,过小会导致频繁分配新数据块。
(4) size_t size
  • 类型:标准库的无符号整型(通常为 unsigned long)。
  • 作用:指定链表中每个元素的大小(字节)。
  • 要求
    • 必须与实际存储的数据类型大小一致(如 sizeof(ngx_table_elt_t))。

详解


1. 分配初始内存块
list->part.elts = ngx_palloc(pool, n * size);

为链表的第一个数据块分配内存,大小为 n * size

ngx_pallocpool 分配内存,返回指针赋给 part.elts


2. 检查内存分配结果
if (list->part.elts == NULL) {
    return NGX_ERROR;
}

验证内存分配是否成功。

内存分配失败会导致后续操作崩溃,需立即返回错误。

eltsNULL,说明分配失败,返回 NGX_ERROR


3. 初始化当前块元素计数
list->part.nelts = 0;

设置当前块已用元素数量为 0。

nelts(number of elements)记录块内已使用的元素数,初始时未添加元素。

提供计数功能,便于后续判断是否需要分配新块。


4. 初始化当前块的后继指针
list->part.next = NULL;

标记当前块为最后一个块,无后续块。

链表初始仅包含一个块,后续块通过 next 指针链接。


5. 设置最后一个块的指针
list->last = &list->part;

last 指向链表的第一个块(即当前唯一块)。

last 是指向链表最后一个块的指针,用于快速追加元素。

&list->part 获取第一个块的地址,赋给 last

通过 last 直接定位到链表尾部,避免遍历整个链表,提升插入效率。


6. 保存元素大小
list->size = size;

记录每个元素的大小(字节)。

后续添加元素时需根据 size 计算内存偏移量。


7. 保存预分配元素数量
list->nalloc = n;

记录每个块预分配的元素数量。

新块分配时需按 n 预分配内存,平衡内存使用与性能。

控制内存分配粒度,减少碎片化。


8. 关联内存池
list->pool = pool;

保存内存池指针,用于后续内存分配。


9. 返回成功状态
return NGX_OK;

通知调用者初始化成功。

明确函数执行结果,便于错误处理。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# OnnxRuntime部署DAMO-YOLO香烟检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…

[密码学实战]Java生成SM2根证书及用户证书

前言 在国密算法体系中,SM2是基于椭圆曲线密码(ECC)的非对称加密算法,广泛应用于数字证书、签名验签等场景。本文将结合代码实现,详细讲解如何通过Java生成SM2根证书及用户证书,并深入分析其核心原理。 一、证书验证 1.代码运行结果 2.根证书验证 3.用户证书验证 二、…

安装 cnpm 出现 Unsupported URL Type “npm:“: npm:string-width@^4.2.0

Unsupported URL Type "npm:": npm:string-width^4.2.0 可能是 node 版本太低了,需要安装低版本的 cnpm 试试 npm cache clean --force npm config set strict-ssl false npm install -g cnpm --registryhttps://registry.npmmirror.com 改为 npm insta…

探秘基带算法:从原理到5G时代的通信变革【九】QPSK调制/解调

文章目录 2.8 QPSK 调制 / 解调简介QPSK 发射机的实现与原理QPSK 接收机的实现与原理QPSK 性能仿真QPSK 变体分析 本博客为系列博客,主要讲解各基带算法的原理与应用,包括:viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/…

四、数据存储

在爬虫项目中,我们需要将目标站点数据进行持久化保存,一般数据保存的方式有两种: 文件保存数据库保存 在数据保存的过程中需要对数据完成去重操作,所有需要使用 redis 中的 set 数据类型完成去重。 1.CSV文件存储 1.1 什么是c…

C# OnnxRuntime部署DAMO-YOLO人头检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name:input tensor:Floa…

Metal学习笔记七:片元函数

知道如何通过将顶点数据发送到 vertex 函数来渲染三角形、线条和点是一项非常巧妙的技能 — 尤其是因为您能够使用简单的单行片段函数为形状着色。但是,片段着色器能够执行更多操作。 ➤ 打开网站 https://shadertoy.com,在那里您会发现大量令人眼花缭乱…

【Mac】2025-MacOS系统下常用的开发环境配置

早期版本的一个环境搭建参考 1、brew Mac自带终端运行: /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Installation successful!成功后运行三行命令后更新环境(xxx是mac的username&a…

蓝桥杯web第三天

展开扇子题目, #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子,子元素旋转 webkit display: -webkit-box:将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical:设置伸缩盒子的子元素排列方…

Qt基础入门-详解

前言 qt之路正式开启 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&#x1f44…

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级

以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…

移动端国际化翻译同步解决方案-V3

1.前言 因为软件出海,从在上上家公司就开始做翻译系统,到目前为止已经出了两个比较大的版本了,各个版本解决的痛点如下: V1版本: 主要针对的是AndroidiOS翻译不一致和翻译内容管理麻烦的问题,通过这个工具…

多空狙击线-新指标-图文教程,多空分界买点以及强弱操盘技术教程,通达信炒股软件指标

“多空狙击线”指标 “多空狙击线”特色指标是量能型技术指标,主要用于分析股票市场中机构做多/做空力量的强程度。该指标的构成、定义与原理如下: “多空狙击线”指标,又称机构做多/做空能量线,通过计算和分析股票市场中机构做多/做空力量…

零信任架构和传统网络安全模式的

零信任到底是一个什么类型的模型?什么类型的思想或思路,它是如何实现的,我们要做零信任,需要考虑哪些问题? 零信任最早是约翰金德瓦格提出的安全模型。早期这个模型也是因为在安全研究上考虑的一个新的信任式模型。他最…

Oracle 11g的部署配置

1、进入官网下载所需版本的Oracle 2、安装 ①:选择setup.exe开始安装 ②:安装提示如下,直接忽略,选是 ③:配置安全更新 填写邮箱,并取消勾选 ④:如果点击下一步,提示什么代理啥的…

下载b站视频音频

文章目录 方案一:jjdown如何使用 方案二:bilibili哔哩哔哩下载助手如何使用进入插件网站插件下载插件安装 使用插件下载视频音频:复制音频下载地址 方案三:bat命令下载单个音频下载单个视频下载单个音视频 方案一:jjdo…

记录spring-boot 3.X版本整合RocketMq

版本信息 先把该次整合的版本信息列如下: spring-boot spring-cloud rocketmq-spring-boot-starter rocketmq-client rocketmq 3.0.13 2022.0.5 2.2.3 4.9.8 4.9.8 版本信息是如何选择的呢?看rocketMq官网springcloud alibaba版本声明 rock…

探秘基带算法:从原理到5G时代的通信变革【六】CRC 校验

文章目录 2.5 CRC 校验2.5.1 前言2.5.2 CRC算法简介2.5.3 CRC计算的详细过程2.5.4 CRC校验的两种方法详解**分离比较法****整体运算法****不同位出错与余数的关系****总结** 2.5.5 CRC计算的C实现及工具介绍**C实现CRC计算****CRC计算工具推荐** **2.5.6 总结:CRC校…

水仙花数(华为OD)

题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 13 53 33。 输入描述 第一行输入一个整数n,表示一个n位的正整数。n在3到7之间&#x…

《白帽子讲 Web 安全》之深入同源策略(万字详解)

目录 引言 一、同源策略基础认知 (一)定义 (二)作用 (三)作用机制详解 二、同源策略的分类 (一)域名同源策略 (二)协议同源策略 (三&…