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

发布于:2025-03-02 ⋅ 阅读:(76) ⋅ 点赞:(0)

详解(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_cachelimit_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;
}

若初始化失败,销毁内存池并终止函数。
确保失败时释放所有已分配资源。



网站公告

今日签到

点亮在社区的每一天
去签到