ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: Когда может возникнуть ситуация, что rev->instance != instance?
  • From: "megalodon" <nginx-forum@xxxxxxxx>
  • Date: Fri, 27 Sep 2013 12:45:27 -0400
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=helium.jlkhosting.com; s=x; h=Date:Sender:From:References:In-Reply-To:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To; bh=Za4/yOsK5HiUaDoATzotOsBF8juVZ+N+ckKMiXY5v68=; b=Ek1NegHcD7SNO95SD/7Bze0gOOTlh5BGnIpKWUfyHXJm0zxs7fvqgR2IbHu/JpCilNtw9QQ2OGSI604s2MZk1UTrZ5OAwJ5YUavweeWTTZM1TAvHU8Jg4VzmXhN1pv4aUYQiu0ZxWQ2ugduUwOK9avosjZxzWvlHo6MNQ+IBaCA=;
  • In-reply-to: <201309271952.14209.vbart@nginx.com>
  • References: <201309271952.14209.vbart@nginx.com>

Пытаюсь вникнуть в мысль: "Мы могли закрыть соединение до того, как
добрались до обработки событий". Но где в промежутке между epoll_wait() и
итерацией цикла, в которой мы обрабатываем событие то место, где мы можем
потенциально закрыть сокет?

    events = epoll_wait(ep, event_list, (int) nevents, timer);

    err = (events == -1) ? ngx_errno : 0;

    if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
        ngx_time_update();
    }

    if (err) {
    .....
    }

    if (events == 0) {
       .....
    }

    ngx_mutex_lock(ngx_posted_events_mutex);

    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) {

Если c->fd не равно -1 и если  rev->instance не совпадает с instance, то
получается, что где-то между строками    
 events = epoll_wait(ep, event_list, (int) nevents, timer);   и   
   .....
 if (c->fd == -1 || rev->instance != instance) { 
произошло инвертирование этого поля?


"Несоответствие instance возможно, когда мы уже закрыли соединение, про
которое нам сообщает ядро." Получается, что пока процесс спал, будучи
заблокированным на шаге epoll_wait(), каким-то образом сокет закрылся и
структура ngx_connection_t была использована повторно, но как, ведь процесс
был заблокирован?

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

_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.