How can the nginx detect the stale event using 'instance'?

김수영 sykim at etri.re.kr
Tue Feb 21 23:59:18 UTC 2012


Dear Maxim,

Thanks for your comments.

Could you please explain it more details?

I have only seen the epoll module code not kqueue module. The routine is similar to kqueue.

-------------
(ngx_epoll_add_event)
    ee.data.ptr = (void *) ((uintptr_t) c | ev->instance);

(ngx_epoll_process_events)
    instance = (uintptr_t) c & 1;
    if (c->fd == -1 || rev->instance != instance) {...}
-------------

I'm wondering who set the instance bit.. I just found in ngx_event_process_init() and ngx_get_connection().

-------------
(ngx_event_process_init)
    rev = cycle->read_events;
    for (i = 0; i < cycle->connection_n; i++) {
        rev[i].closed = 1;
        rev[i].instance = 1;
#if (NGX_THREADS)
        rev[i].lock = &c[i].lock;
        rev[i].own_lock = &c[i].lock;
#endif
    }

(ngx_get_connection)
    instance = rev->instance;
    ngx_memzero(rev, sizeof(ngx_event_t));
    ngx_memzero(wev, sizeof(ngx_event_t));
    rev->instance = !instance;
    wev->instance = !instance;
-------------

BUT, I guess that ngx_event_process_init() may be called once 

and ngx_get_connection() may be called when a new connection is accepted(I'm not sure-_-;).

When ngx_event_process_init() is called, instance bit is 1

and then when a new connection is accepted ngx_get_connection(), instance bit is 0. (next ngx_get_connection() will set the instance bit to 1).

And then what happen? I can't trace how the nginx handle it, anymore..-_-;

Please let me know next scenario..^^

-----Original Message-----
From: nginx-devel-bounces at nginx.org [mailto:nginx-devel-bounces at nginx.org] On Behalf Of Maxim Dounin
Sent: Tuesday, February 21, 2012 10:28 PM
To: nginx-devel at nginx.org
Subject: Re: How can the nginx detect the stale event using 'instance'?

Hello!

On Tue, Feb 21, 2012 at 06:51:19PM +0900, 김수영 wrote:

> These days, I am studying the nginx source code..
> 
> I think this code is very beautiful, and fully modulized.. BUT so it 
> is difficult to follow the code.-_-;
> 
> BTW, In struct ngx_event_s, there is ‘unsigned instance:1;’..
> 
> I can’t understand how can the nginx detect the stale events using 
> it.-_-;
> 
> Could you please explain the detection mechanism or give me a hint?

The "instance" bit is passed in a event user data to the kernel and when the kernel returns the event it's checked against one recorded in the event structure.  If there is no match - this means the event reported by the kernel is stale (i.e. we've already closed the descriptor in the very same event loop iteration).

See e.g. src/event/modules/ngx_kqueue_module.c for details, in particular ngx_kqueue_set_event() and ngx_kqueue_process_events().

Maxim Dounin

_______________________________________________
nginx-devel mailing list
nginx-devel at nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel


More information about the nginx-devel mailing list