Chinaunix首页 | 论坛 | 博客
  • 博客访问: 444563
  • 博文数量: 138
  • 博客积分: 4114
  • 博客等级: 上校
  • 技术积分: 1341
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-14 20:41
文章分类

全部博文(138)

文章存档

2014年(1)

2013年(2)

2012年(78)

2011年(13)

2010年(34)

2009年(10)

我的朋友

分类: LINUX

2012-05-14 14:37:06

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 *.

另外:
至于作者为什么要这样设计, 我还没有想到, 如果有朋友知道的话, 告知一声,谢谢

阅读(661) | 评论(0) | 转发(0) |
0

上一篇:nginx的epoll

下一篇:算法面试题 搜集

给主人留下些什么吧!~~