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