//使用宏来替换复杂抽象的实现过程,如下面的函数中的
epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)
{
ngx_epoll_conf_t *epcf;
epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
if (ep == -1) {
ep = epoll_create(cycle->connection_n / 2);
if (ep == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"epoll_create() failed");
return NGX_ERROR;
}
......
}
......
}
//下面理解下这个宏的过程表示
ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
struct ngx_cycle_s {
void ****conf_ctx;
......
}
struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;
......
}
#define ngx_event_get_conf(conf_ctx, module) \
(*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];
#define ngx_get_conf(conf_ctx, module) conf_ctx[module.index]
//由此可见这个结构上一个二维表[][]
//由module的index和ctx_index决定其所在位置,这个宏就是找到这个位置的指针,
//如果使用直接的代码实现方式,这部分代码显得凌乱,可见宏在代码的实现上有非常好的益处。
epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
ngx_epoll_init(ngx_cycle_t *cycle, ngx_msec_t timer)
{
ngx_epoll_conf_t *epcf;
epcf = ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
if (ep == -1) {
ep = epoll_create(cycle->connection_n / 2);
if (ep == -1) {
ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
"epoll_create() failed");
return NGX_ERROR;
}
......
}
......
}
//下面理解下这个宏的过程表示
ngx_event_get_conf(cycle->conf_ctx, ngx_epoll_module);
struct ngx_cycle_s {
void ****conf_ctx;
......
}
struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index;
......
}
#define ngx_event_get_conf(conf_ctx, module) \
(*(ngx_get_conf(conf_ctx, ngx_events_module))) [module.ctx_index];
#define ngx_get_conf(conf_ctx, module) conf_ctx[module.index]
//由此可见这个结构上一个二维表[][]
//由module的index和ctx_index决定其所在位置,这个宏就是找到这个位置的指针,
//如果使用直接的代码实现方式,这部分代码显得凌乱,可见宏在代码的实现上有非常好的益处。