event/ngx_event_posted.c(h)源代码分析 By ivan.L 发表于 2018-12-19 本章主要实现对nginx posted event消息的处理。 1. ngx_event_posted.h头文件 1.1 相关宏定义 /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_EVENT_POSTED_H_INCLUDED_ #define _NGX_EVENT_POSTED_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> #define ngx_post_event(ev, q) \ \ if (!(ev)->posted) { \ (ev)->posted = 1; \ ngx_queue_insert_tail(q, &(ev)->queue); \ \ 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); \ } #define ngx_delete_posted_event(ev) \ \ (ev)->posted = 0; \ ngx_queue_remove(&(ev)->queue); \ \ ngx_log_debug1(NGX_LOG_DEBUG_CORE, (ev)->log, 0, \ "delete posted event %p", ev); 下面我们简要介绍一下这两个宏定义: ngx_post_event: 此宏定义用于将事件ev插入到队列q的队尾。 ngx_delete_posted_event: 此用定义用于将事件ev从队列中移除 1.2 相关函数声明 //遍历队列中的事件,然后调用事件所绑定的handler回调函数 void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted); 1.3 相关全局变量声明 extern ngx_queue_t ngx_posted_accept_events; extern ngx_queue_t ngx_posted_events; #endif /* _NGX_EVENT_POSTED_H_INCLUDED_ */ ngx_posted_accept_events: 对于accept事件的投递队列 ngx_posted_events: 对于普通事件的投递队列 2. ngx_event_posted.c源文件 2.1 相关全局变量定义 /* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #include <ngx_config.h> #include <ngx_core.h> #include <ngx_event.h> ngx_queue_t ngx_posted_accept_events; ngx_queue_t ngx_posted_events; ngx_posted_accept_events: 对于accept事件的投递队列 ngx_posted_events: 对于普通事件的投递队列 2.2 函数ngx_event_process_posted() void ngx_event_process_posted(ngx_cycle_t *cycle, ngx_queue_t *posted) { ngx_queue_t *q; ngx_event_t *ev; while (!ngx_queue_empty(posted)) { q = ngx_queue_head(posted); ev = ngx_queue_data(q, ngx_event_t, queue); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "posted event %p", ev); ngx_delete_posted_event(ev); ev->handler(ev); } } 此函数较为简单,就是不断的从事件队列中取出事件,然后调用事件所绑定的handler()回调函数进行处理 [参看]