Nginx源码分析—过期事件和惊群事件的处理
过期事件:每个事件的date域都是一个结构体ngx_connection_t结构体,表示对应的连接。对于一个结构体struct epoll_event 中的data.ptr成员存储的是ngx_connection_t连接,这里使用Instance标志位来标识,下面就配合ngx_epoll_process_events方法说明他的用法。
Data.ptr (void* )((uintptr_t) c | ev->instance); 这事添加事件的使用对ptr进行的初始化。
那么在检查的时候怎么使用它呢?
遍历epoll_wait返回的所有事件,对照上面提到的ngx_epoll_add_event方法,可以看到ptr成员就是ngx_connection_t连接的地址,但最后一位有特殊含义,需要把他屏蔽到。
C= event_list[i].data.ptr;
//将地址的最后一位取出来,用Instace变量标识
Instance= (uintptr_t) c &1;
/*五路是32位还是64位机器,其地址的最后一位肯定是0.可以用下面的这行语句把ngx_connection_t的地址还原到真正的地址值*/
C = (ngx_connection_t*) ((uintptr_t) c& (uintptr_t) ~1);
//取出事件
Rev= c->read;
//判断这个度事件是否为过期事件
If(c->fd== -1 || wev->instance != instance)