nginx的消息队列是如何处理nginx的消息的?
ngx_worker_process_cycle
|
|__ ngx_process_events_and_timers(cycle)
|
|__ngx_process_events(cycle, timer, flags)
| |
| |___ ngx_epoll_process_events
| |__ epoll_wait
| |__在这个函数里面可以看到如下语句
| if (flags & NGX_POST_EVENTS) {
| queue = (ngx_event_t **)(rev->accept?
| &ngx_posted_accepted_events:&ngx_posted_events);
| ngx_locked_post_event(rev, queue);
| } else {
| rev->handler(rev);
| }
|
|
|
|
|__ngx_event_process_posted(cycle, &ngx_posted_events)
这里我们可以看出来
在 ngx_process_events里面, 如何设置了NGX_POST_EVENTS,则并没有马上执行
rev或者wev的handler,而是发送到消息队列
进入ngx_locked_post_event(rev, queue)看看是如何把事件添加到消息队列中的
#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_CORE, ev->log, 0, "post event %p", ev); \
} else { \
ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "update posted event %p", ev);\
} \
在 ngx_event_s数据结构中可以看到
struct ngx_event_s {
....
ngx_event_t *next;
ngx_event_t **prev;
....
};
ngx_locked_post_event就是一个双向链表的插入操作,这里就不在分析了,
但是 可以看出event并不是一般的双向链表,其前向指针指向的并不是
ngx_event_t, 而是 ngx_event_t *.
另外:
至于作者为什么要这样设计, 我还没有想到, 如果有朋友知道的话, 告知一声,谢谢
阅读(668) | 评论(0) | 转发(0) |