Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(3)
详解(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 倍容量扩展。
- 动态扩容:当元素数量超过