Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(5)
详解(5)
if (old_cycle->shared_memory.part.nelts) {
n = old_cycle->shared_memory.part.nelts;
for (part = old_cycle->shared_memory.part.next; part; part = part->next)
{
n += part->nelts;
}
} else {
n = 1;
}
if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t))
!= NGX_OK)
{
ngx_destroy_pool(pool);
return NULL;
}
1 检查旧周期共享内存是否存在
if (old_cycle->shared_memory.part.nelts) {
判断旧周期(old_cycle
)的共享内存列表是否非空。
shared_memory
存储 Nginx 的共享内存区域(如 ssl_session_cache
、limit_conn_zone
)。
在平滑重启或重新配置时,新周期需继承这些区域以避免重复创建。
2 初始化容量 n
为旧周期共享内存数量
n = old_cycle->shared_memory.part.nelts;
获取旧周期共享内存列表第一个分片(part
)的元素数量。
ngx_list_t
是分片链表结构,每个分片(part
)包含 nelts
个元素。此处初始化 n
为第一个分片的元素数。
3 遍历所有分片累加元素数量
for (part = old_cycle->shared_memory.part.next; part; part = part->next) {
n += part->nelts;
}
遍历旧周期 shared_memory
的所有分片,累加总元素数到 n
。
ngx_list_t
可能包含多个分片(如元素数量超过单个分片容量),需遍历所有分片统计总数。
精确预分配:确保新周期的 shared_memory
容量足够容纳所有旧区域,避免扩容开销。
4 若无旧共享内存,设置默认容量
} else {
n = 1;
}
若旧周期无共享内存,设置初始容量 n = 1
。
1 是最小值,确保至少能容纳一个共享内存区域(如默认配置)。
5 初始化 shared_memory
列表
if (ngx_list_init(&cycle->shared_memory, pool, n, sizeof(ngx_shm_zone_t)) != NGX_OK)
初始化新周期的 shared_memory
列表。
6 错误处理
{
ngx_destroy_pool(pool);
return NULL;
}
若初始化失败,销毁内存池并终止函数。
确保失败时释放所有已分配资源。