详细解释请参考《Nginx模块开发与架构解析》的9.6.3节ngx_epoll_module模块的实现
nginx源码如下:
struct ngx_event_s {
......
/* used to detect the stale events in kqueue, rtsig, and epoll */
/*
这个标志位用于区分当前事件是否过期,它仅仅是给事件驱动模块使用的,而事件消费模块可不用关心。
为什么需要这个标志位呢?当开始处理一批事件时,处理前面的事件可能会关闭一些连接,而这些连接有可能影响这批事件中还未处理到的后面的事件。
这时,可通过instance标志位来避免处理后面的已经过期的事件。
*/
unsigned instance:1;
......
};
static ngx_int_t
ngx_epoll_add_event(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags)
{
int op;
uint32_t events, prev;
ngx_event_t *e;
ngx_connection_t *c;
struct epoll_event ee;
c = ev->data;
events = (uint32_t) event;
if (event == NGX_READ_EVENT) {
e = c->write;
prev = EPOLLOUT;
#if (NGX_READ_EVENT !=