Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(3)

server/2025/2/28 17:09:50/

详解(3)


初始化路径数组(paths

   n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *))!= NGX_OK){ngx_destroy_pool(pool);return NULL;}ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *));

n = old_cycle->paths.nelts ? old_cycle->paths.nelts : 10;

确定 paths 数组的初始容量 n。若旧周期(old_cycle)存在路径配置,则继承其大小;否则预分配 10 个元素。

paths 用于存储 Nginx 运行时路径(如临时文件目录)。旧周期可能已包含路径信息(如 client_body_temp_path),新周期需复用或初始化。

资源复用:继承旧周期的容量,避免重复计算路径数量。
预分配优化:默认值 10 是经验值,平衡内存占用与扩容开销。


if (ngx_array_init(&cycle->paths, pool, n, sizeof(ngx_path_t *)) != NGX_OK)

初始化 cycle->paths 数组,分配内存池 pool 中的内存,容量 n,每个元素为 ngx_path_t* 类型。

ngx_array_t 是 Nginx 动态数组结构,支持自动扩容。此处存储指向路径对象(ngx_path_t)的指针。

若初始化失败,立即销毁内存池(ngx_destroy_pool),确保资源一致性。


ngx_memzero(cycle->paths.elts, n * sizeof(ngx_path_t *));

paths 数组的前 n 个元素清零(初始化为 NULL)。

ngx_array_init 分配的内存未初始化,可能包含脏数据。路径指针需显式置空,避免后续误判。

确保数组初始状态明确(所有元素为 NULL)。


总结

代码行逻辑目标设计思想
n = ...确定初始容量继承旧配置或预分配,平衡性能与内存。
ngx_array_init初始化动态数组内存池管理 + 自动扩容,支持灵活扩展。
ngx_memzero初始化内存避免脏数据,确保指针安全。

关键数据结构
  • ngx_array_t
    typedef struct {void        *elts;    // 元素数组指针ngx_uint_t   nelts;   // 当前元素数量size_t       size;    // 单个元素大小ngx_uint_t   nalloc;  // 数组容量ngx_pool_t  *pool;    // 内存池
    } ngx_array_t;
    
    • 动态扩容:当元素数量超过 nalloc 时,自动按 2 倍容量扩展。

http://www.ppmy.cn/server/171338.html

相关文章

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP(传输控制协议)工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级,从底层到顶层依次是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

git 使用常见错误整理

1. git am 应用补丁时遇到错误 fatal: previous rebase directory .git/rebase-apply still exists but mbox given fatal:之前的变基目录 .git/rebase-apply仍然存在,但却提供了mbox 答:这通常是因为之前的 git am 或 git rebase 操作失败后&#xf…

单片机中有FLASH为啥还需要EEROM?

单片机里同时存在Flash和EEPROM,主要是因为它们在存储特性和使用场景上有本质区别: 1. 写数据方式不同: Flash像黑板擦:改一个字就要擦掉整个扇区(比如4KB),再重新写一遍。频繁改小数据时效率…

深入了解 NAT 模式:网络地址转换的奥秘

深入了解 NAT 模式:网络地址转换的奥秘 在计算机网络的世界里,NAT 模式(Network Address Translation,网络地址转换)扮演着至关重要的角色。它就像是网络中的翻译官,在不同网络地址之间进行转换&#xff0…

【附源码】基于opencv+pyqt5搭建的人脸识别系统

文章目录 前言一、人脸检测二、人脸识别1.训练识别器2.识别人脸 三、界面相关1.Qlabel展示图片2.表格跟随内容而增加和减少3.选择图片文件4.警告框 四、源码获取总结 前言 人脸识别技术作为人工智能领域的一颗璀璨明珠,正逐渐渗透到我们生活的每一个角落&#xff0…

vue3使用iframe全屏展示pdf效果

最近的一个功能是编写一个pdf展示的组件,外部传入pdf的链接,根据这个功能,可以使用iframe去展示pdf,目前主要是将预览pdf的样式调整成与屏幕宽高一样 1.pdf使用iframe 2.使用translate将这个组件,使用to属性将目标元素…

一周学会Flask3 Python Web开发-Jinja2模板继承和include标签使用

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 不管是开发网站还是后台管理系统,我们页面里多多少少有公共的模块。比如博客网站,就有公共的头部&…