24,860
社区成员




/* 首先ngx_event_t结构的定义是:*/
typedef struct ngx_event_s ngx_event_t;
struct ngx_event_s {
... /* 其它结构字段 */
ngx_event_t *next;
ngx_event_t **prev;
};
/* 这个互斥体用于保护事件队列 */
ngx_mutex_t *ngx_posted_events_mutex;
/*
* ngx_posted_events事件队列,官方nginx还有一个事件队列ngx_posted_accept_events。
*/
ngx_thread_volatile ngx_event_t *ngx_posted_events;
/* 事件入队 */
/*
* ev参数传入检测到的IO事件(用ngx_event_t结构变量来保存)的指针,
* queue参数传入ngx_posted_events的指针,也就是ngx_event_t二级指针。
*/
#define ngx_locked_post_event(ev, queue) \
\
if ((ev)->prev == NULL) { \
(ev)->next = (ngx_event_t *) *(queue); \
(ev)->prev = (ngx_event_t **) (queue); \
*(queue) = ev; \
\
if ((ev)->next) { \
(ev)->next->prev = &(ev)->next; \
} \
\
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, (ev)->log, 0, \
"post event %p", ev); \
\
} else { \
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, (ev)->log, 0, \
"update posted event %p", ev); \
}
#define ngx_post_event(ev, queue) \
\
ngx_mutex_lock(ngx_posted_events_mutex); \
ngx_locked_post_event(ev, queue); \
ngx_mutex_unlock(ngx_posted_events_mutex);
/* 事件出队 */
#define ngx_delete_posted_event(ev) \
\
*(ev)->prev = (ev)->next; \
\
if ((ev)->next) { \
(ev)->next->prev = (ev)->prev; \
} \
\
(ev)->prev = NULL; \
\
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, (ev)->log, 0, \
"delete posted event %p", ev);