入口函数main位于 src/core/nginx.c
调用ngx_single_process_cycle来初始化socket模型
ngx_single_process_cycle位于src/os/win32/ngx_process_cycle.c
代码如下:
void
ngx_single_process_cycle(ngx_cycle_t *cycle)
{
ngx_int_t i;
ngx_tid_t tid;
for (i = 0; ngx_modules[i]; i++) {
if (ngx_modules[i]->init_process) {
if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
/* fatal */
exit(2);
}
}
}
ngx_process_init(cycle);
ngx_console_init(cycle);
if (ngx_create_signal_events(cycle) != NGX_OK) {
exit(2);
}
if (ngx_create_thread(&tid, ngx_worker_thread, NULL, cycle->log) != 0) {
/* fatal */
exit(2);
}
/* STUB */
WaitForSingleObject(ngx_stop_event, INFINITE);
}
其中关键是调用init_process,init_process是struct ngx_module_s里面的一个成员。
ngx_module_s定义如下:
struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;
ngx_uint_t spare0;
ngx_uint_t spare1;
ngx_uint_t spare2;
ngx_uint_t spare3;
ngx_uint_t version;
void *ctx;
ngx_command_t *commands;
ngx_uint_t type;
ngx_int_t (*init_master)(ngx_log_t *log);
ngx_int_t (*init_module)(ngx_cycle_t *cycle);
ngx_int_t (*init_process)(ngx_cycle_t *cycle);
ngx_int_t (*init_thread)(ngx_cycle_t *cycle);
void (*exit_thread)(ngx_cycle_t *cycle);
void (*exit_process)(ngx_cycle_t *cycle);
void (*exit_master)(ngx_cycle_t *cycle);
uintptr_t spare_hook0;
uintptr_t spare_hook1;
uintptr_t spare_hook2;
uintptr_t spare_hook3;
uintptr_t spare_hook4;
uintptr_t spare_hook5;
uintptr_t spare_hook6;
uintptr_t spare_hook7;
};
init_process作为指针指向的实际上是函数static ngx_int_t ngx_event_process_init(ngx_cycle_t *cycle);该函数位于 src/event/ngx_event.c。
这里对socket模型进行初始化
if (module->actions.init(cycle, ngx_timer_resolution) != NGX_OK) {
/* fatal */
exit(2);
}
init也是一个函数指针,实际调用的是static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer),它位于src/event/modules/ngx_iocp_module.c里面。
详细代码如下
static ngx_int_t
ngx_iocp_init(ngx_cycle_t *cycle, ngx_msec_t timer)
{
ngx_iocp_conf_t *cf;
cf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);
if (iocp == NULL) {
iocp = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0,
cf->threads);
}
if (iocp == NULL) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
"CreateIoCompletionPort() failed");
return NGX_ERROR;
}
ngx_io = ngx_iocp_io;
ngx_event_actions = ngx_iocp_module_ctx.actions;
ngx_event_flags = NGX_USE_AIO_EVENT|NGX_USE_IOCP_EVENT;
if (timer == 0) {
return NGX_OK;
}
/*
* The waitable timer could not be used, because
* GetQueuedCompletionStatus() does not set a thread to alertable state
*/
if (timer_thread == NULL) {
msec = timer;
if (ngx_create_thread(&timer_thread, ngx_iocp_timer, &msec, cycle->log)
!= 0)
{
return NGX_ERROR;
}
}
ngx_event_flags |= NGX_USE_TIMER_EVENT;
return NGX_OK;
}
首先调用CreateIoCompletionPort创建IOCP对象,然后调用ngx_create_thread创建多个线程,并纳入到IOCP的线程池中。