Добрый день.
В функции ngx_epoll_process_events() есть такой участок кода:
for (i = 0; i < events; i++) {
c = event_list[i].data.ptr;
instance = (uintptr_t) c & 1;
c = (ngx_connection_t *) ((uintptr_t) c & (uintptr_t) ~1);
rev = c->read;
if (c->fd == -1 || rev->instance != instance) {
.....
}
.....
}
Условие rev->instance != instance будет проверяться, если c->fd != -1, т.е. в случае когда дескриптор не был закрыт.
c->fd устанавливается в -1 в функциях: ngx_close_connection() и ngx_close_accepted_connection().
Но rev->instance инвертируется в функции ngx_get_connection(), которая вызывается в ngx_event_accept().
Получается, что несоответсвие instance возможно, когда мы не закрыли соединение и при этом акцептировали новое и для него была выделена уже существующая структура ngx_connection_t ??