nginx timer in log module

洪志道 hongzhidao at gmail.com
Sat Sep 17 01:43:21 UTC 2016


Well, I get it.

By the way, If I want to add a timer, it can do something like crontab in
worker process.
For example, we collect data in worker process and dump the data every 5
minutes.

event->cancelable = 1;

In event handler, the codes like the following:

static void
ngx_http_test_timer_handler(ngx_event_t *ev)
{

     if (event->timedout) {
         /* todo timedout */
         return;
     }

     if (ngx_terminate || ngx_exiting) {
         /* I'm not sure whether we need to determine the condition */
     }

     /* I think we needn't to explicitly remove the event timer */
     #if 0
     if (ev->timer_set) {
        ngx_del_timer(ev);
    }
    #endif
}

Thanks again.

B.R.~

2016-09-17 8:25 GMT+08:00 洪志道 <hongzhidao at gmail.com>:

> Hi
>
> As the following codes.
>
>
> buffer->event->handler = ngx_http_log_flush_handler;
>
>
> static void
> ngx_http_log_flush_handler(ngx_event_t *ev)
> {
>     ...
>     if (ev->timedout) {
>         ngx_http_log_flush(ev->data, ev->log);
>         return;
>     }
>     ...
> }
>
>
> static void
> ngx_http_log_flush(ngx_open_file_t *file, ngx_log_t *log)
> {
>     ...
>     if (buffer->event && buffer->event->timer_set) {
>         ngx_del_timer(buffer->event);
>     }
> }
>
>
> I find there are two functions explicitly call event handler.
> 1. ngx_event_cancel_timers happened as long as worker process quits.
> 2. ngx_event_expire_timers in ngx_process_events_and_timers.
>
> And they remove timer from timer rbtree, then set timer_set zero.
> After that they call event->handler.
>
> So why we call ngx_del_timer in ngx_http_log_flush again?
>
> Thanks.
>
> B.R~
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.nginx.org/pipermail/nginx-devel/attachments/20160917/cfae69c9/attachment.html>


More information about the nginx-devel mailing list