Когда может возникнуть ситуация, что rev->instance != instance?

megalodon nginx-forum at nginx.us
Fri Sep 27 07:32:53 UTC 2013


Добрый день.

В функции 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 ??

Posted at Nginx Forum: http://forum.nginx.org/read.php?21,243182,243182#msg-243182



Подробная информация о списке рассылки nginx-ru