Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(6)
详解(6)
初始化监听套接字数组(listening
)
n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;
if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t))
!= NGX_OK)
{
ngx_destroy_pool(pool);
return NULL;
}
ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t));
1 确定监听数组初始容量
n = old_cycle->listening.nelts ? old_cycle->listening.nelts : 10;
根据旧周期(old_cycle
)的监听套接字数量设置新周期的初始容量 n
。
若旧周期无监听套接字,则默认预分配 10 个元素。
old_cycle->listening.nelts
是旧周期监听数组的元素数量。- 若存在旧监听套接字,继承其数量;否则使用默认值 10。
监听数组(listening
)存储 Nginx 监听的端口和套接字信息(如 listen 80;
)。在平滑重启时需继承旧配置,避免重新绑定端口。
2 初始化监听数组
if (ngx_array_init(&cycle->listening, pool, n, sizeof(ngx_listening_t)) != NGX_OK)
初始化动态数组 cycle->listening
,用于存储监听套接字信息。
pool
:内存池,用于管理数组内存。n
:初始容量(继承旧值或默认 10)。sizeof(ngx_listening_t)
:每个元素的大小(监听套接字结构体)。
3 错误处理
{
ngx_destroy_pool(pool);
return NULL;
}
若数组初始化失败,销毁内存池并终止函数。
4 初始化内存
ngx_memzero(cycle->listening.elts, n * sizeof(ngx_listening_t));
将监听数组的前 n
个元素清零。
ngx_memzero
是 memset
的封装,确保内存初始化为 0。
动态数组分配的内存可能包含脏数据,直接使用可能导致未定义行为(如误判套接字状态)。