详解(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 倍容量扩展。
- 动态扩容:当元素数量超过
