Writing a timer event (how to execute an event from time to time)

Weibin Yao nbubingo at gmail.com
Tue May 25 09:33:06 MSD 2010


Rogério Schneider at 2010-5-25 13:16 wrote:
> Would you be kind enough to help me understanding how to write an
> event which executes itself from time to time, using Nginx event
> handler?
>
> I would like to register for each request a timer to execute a given
> task each 10 seconds.
>
> I am trying this in my module handler:
>
> static ngx_int_t ngx_http_hello_world_handler(ngx_http_request_t *r)
> {
>     ngx_buf_t    *b;
>     ngx_chain_t   out;
>     int           rc;
>     ngx_event_t     *wev;
>
>     wev = ngx_pcalloc(r->pool, sizeof(ngx_event_t));
>
>     if (wev == NULL) {
>         ngx_log_stderr(0, "wev null");
>         return NGX_ERROR;
>     }
>
>     wev->handler = ngx_http_hello_world_delay_handler;
>     wev->data = r;
>     wev->log = r->connection->log;
>
>     ngx_add_timer(wev, 10000);
>
>     r->headers_out.content_type.len = sizeof("text/plain") - 1;
>     r->headers_out.content_type.data = (u_char *) "text/plain";
>
>     b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));
>
>     out.buf = b;
>     out.next = NULL;
>
>     b->pos = ngx_hello_world;
>     b->last = ngx_hello_world + sizeof(ngx_hello_world);
>     b->memory = 1;
>     b->flush = 1;
>     b->last_buf = 0;
>
>     r->headers_out.status = NGX_HTTP_OK;
>     r->headers_out.content_length_n = -1;
>
>     ngx_http_clear_content_length(r);
>     ngx_http_clear_accept_ranges(r);
>
>     ngx_http_send_header(r);
>
>     rc = ngx_http_output_filter(r, &out);
>
>     return rc; // never got reached due to b->last_buf=0 and chunked response
> }
>
> and the delay handler:
>
> static void ngx_http_hello_world_delay_handler(ngx_event_t *ev)
> {
>     ngx_buf_t    *b;
>     ngx_chain_t   out;
>     int           rc;
>     ngx_connection_t        *c;
>     ngx_http_request_t      *r;
>
>     r = ev->data;
>     c = r->connection;
>
>     if (c->destroyed) {
>         return;
>     }
>
>     out.buf = b;
>     out.next = NULL;
>     b->pos = ngx_hello_world;
>     b->last = ngx_hello_world + sizeof(ngx_hello_world);
>     b->memory = 1;
>     b->flush = 1;
>     b->last_buf = 0;
>
>     rc = ngx_http_output_filter(r, &out);
>
>     return;
> }
>
> Do you think I am missing something? I still getting segfaults just as
> soon as my delay handler is called.
>
> Regards,
>   
Each request may clean its pool when finalizing the request. And the 
timer uses the pool attached with that request. This caused the segfaults.

-- 
Weibin Yao




More information about the nginx-devel mailing list