Mercurial > hg > nginx
diff src/http/ngx_http_event.c @ 53:d1e42f1b8fd4
nginx-0.0.1-2003-01-27-00:08:14 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Sun, 26 Jan 2003 21:08:14 +0000 |
parents | 9f2728644651 |
children | 27b628ef907e |
line wrap: on
line diff
--- a/src/http/ngx_http_event.c Fri Jan 24 16:09:40 2003 +0000 +++ b/src/http/ngx_http_event.c Sun Jan 26 21:08:14 2003 +0000 @@ -115,34 +115,40 @@ #if (HAVE_DEFERRED_ACCEPT) if (ev->ready) { return ngx_http_init_request(ev); - } else { -#endif - ngx_add_timer(ev, c->post_accept_timeout); -#if (USE_KQUEUE) - return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); -#else -#if (HAVE_AIO_EVENT) - if (ngx_event_type == NGX_AIO_EVENT) - return ngx_http_init_request(ev); - else -#endif -#if (HAVE_CLEAR_EVENT) - if (ngx_event_type == NGX_KQUEUE_EVENT) - return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); - else -#endif - return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); -#endif /* USE_KQUEUE */ -#if (HAVE_DEFERRED_ACCEPT) } #endif + + ngx_add_timer(ev, c->post_accept_timeout); + ev->timer_set = 1; + +#if (USE_KQUEUE) + + return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); + +#else + +#if (HAVE_CLEAR_EVENT) + if (ngx_event_flags & NGX_HAVE_CLEAR_EVENT) { + return ngx_add_event(ev, NGX_READ_EVENT, NGX_CLEAR_EVENT); + } +#endif + +#if (HAVE_AIO_EVENT) + if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { + return ngx_http_init_request(ev); + } +#endif + + return ngx_add_event(ev, NGX_READ_EVENT, NGX_LEVEL_EVENT); + +#endif /* USE_KQUEUE */ } static int ngx_http_init_request(ngx_event_t *ev) { - ngx_connection_t *c; - ngx_http_request_t *r; + ngx_connection_t *c; + ngx_http_request_t *r; c = (ngx_connection_t *) ev->data; c->sent = 0; @@ -179,7 +185,6 @@ ev->event_handler = ngx_http_process_request_header; r->state_handler = ngx_http_process_request_line; - r->header_timeout = 1; return ngx_http_process_request_header(ev); } @@ -187,9 +192,9 @@ static int ngx_http_process_request_header(ngx_event_t *ev) { - int n, rc; - ngx_connection_t *c ; - ngx_http_request_t *r; + int n, rc; + ngx_connection_t *c; + ngx_http_request_t *r; ngx_http_log_ctx_t *ctx; c = (ngx_connection_t *) ev->data; @@ -207,10 +212,16 @@ r->header_in->end - r->header_in->last.mem); if (n == NGX_AGAIN) { - if (r->header_timeout) { - r->header_timeout = 0; - ngx_del_timer(ev); + if (!r->header_timeout_set) { + + if (ev->timer_set) { + ngx_del_timer(ev); + } else { + ev->timer_set = 1; + } + ngx_add_timer(ev, ngx_http_client_header_timeout); + r->header_timeout_set = 1; } return NGX_AGAIN; } @@ -244,20 +255,25 @@ if (rc == NGX_OK) { /* HTTP header done */ - if (r->header_timeout) { - r->header_timeout = 0; + if (ev->timer_set) { ngx_del_timer(ev); - ngx_add_timer(ev, ngx_http_client_header_timeout); + ev->timer_set = 0; } return ngx_http_event_request_handler(r); - } else { + } else { /* NGX_AGAIN */ + + if (!r->header_timeout_set) { - if (r->header_timeout) { - r->header_timeout = 0; - ngx_del_timer(ev); + if (ev->timer_set) { + ngx_del_timer(ev); + } else { + ev->timer_set = 1; + } + ngx_add_timer(ev, ngx_http_client_header_timeout); + r->header_timeout_set = 1; } return rc; @@ -430,14 +446,20 @@ static int ngx_http_event_request_handler(ngx_http_request_t *r) { - int rc; - ngx_msec_t timeout; + int rc; + ngx_msec_t timeout; + ngx_event_t *rev, *wev; - ngx_del_timer(r->connection->read); - r->header_timeout = 0; + rev = r->connection->read; + wev = r->connection->write; + + if (rev->timer_set) { + ngx_del_timer(rev); + rev->timer_set = 0; + } r->state_handler = NULL; - r->connection->read->event_handler = ngx_http_block_read; + rev->event_handler = ngx_http_block_read; rc = ngx_http_handler(r); @@ -448,10 +470,10 @@ /* handler has done its work but transfer is not completed */ if (rc == NGX_AGAIN) { #if (HAVE_CLEAR_EVENT) - if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, + if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_CLEAR_EVENT) == NGX_ERROR) { #else - if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, + if (ngx_add_event(wev, NGX_WRITE_EVENT, NGX_ONESHOT_EVENT) == NGX_ERROR) { #endif return ngx_http_close_request(r); @@ -462,13 +484,13 @@ r->connection->sent); timeout = (ngx_msec_t) (r->connection->sent * 10); ngx_log_debug(r->connection->log, "timeout: %d" _ timeout); - ngx_add_timer(r->connection->write, timeout); + ngx_add_timer(wev, timeout); } else { - ngx_add_timer(r->connection->write, 10000); + ngx_add_timer(wev, 10000); } - r->connection->write->event_handler = ngx_http_writer; + wev->event_handler = ngx_http_writer; return rc; } @@ -496,7 +518,7 @@ ngx_http_close_request(r); r->connection->buffer->pos.mem = r->connection->buffer->last.mem = r->connection->buffer->start; - r->connection->read->event_handler = ngx_http_keepalive_handler; + rev->event_handler = ngx_http_keepalive_handler; } @@ -527,12 +549,17 @@ ngx_log_debug(ev->log, "sent: " QD_FMT _ c->sent); ngx_log_debug(ev->log, "timeout: %d" _ timeout); - ngx_del_timer(ev); + if (ev->timer_set) { + ngx_del_timer(ev); + } else { + ev->timer_set = 1; + } + ngx_add_timer(ev, timeout); } if (ev->oneshot) - if (ngx_add_event(r->connection->write, NGX_WRITE_EVENT, + if (ngx_add_event(ev, NGX_WRITE_EVENT, NGX_ONESHOT_EVENT) == NGX_ERROR) { return ngx_http_close_request(r); } @@ -575,12 +602,19 @@ int ngx_http_discard_body(ngx_http_request_t *r) { + ngx_event_t *ev; + + ev = r->connection->read; + ngx_log_debug(r->connection->log, "set discard body"); - ngx_del_timer(r->connection->read); + if (ev->timer_set) { + ngx_del_timer(ev); + ev->timer_set = 0; + } if (r->client_content_length) - r->connection->read->event_handler = ngx_http_read_discarded_body; + ev->event_handler = ngx_http_read_discarded_body; return NGX_OK; } @@ -665,19 +699,27 @@ static int ngx_http_set_lingering_close(ngx_http_request_t *r) { + ngx_event_t *ev; ngx_http_core_loc_conf_t *lcf; + ev = r->connection->read; + lcf = (ngx_http_core_loc_conf_t *) ngx_http_get_module_loc_conf(r, ngx_http_core_module_ctx); r->lingering_time = ngx_time() + lcf->lingering_time; r->connection->read->event_handler = ngx_http_lingering_close_handler; - ngx_del_timer(r->connection->read); - ngx_add_timer(r->connection->read, lcf->lingering_timeout); + if (ev->timer_set) { + ngx_del_timer(ev); + } else { + ev->timer_set = 1; + } - if (r->connection->read->blocked) { - if (ngx_add_event(r->connection->read, NGX_READ_EVENT, + ngx_add_timer(ev, lcf->lingering_timeout); + + if (ev->blocked) { + if (ngx_add_event(ev, NGX_READ_EVENT, #if (HAVE_CLEAR_EVENT) NGX_CLEAR_EVENT) == NGX_ERROR) #else @@ -688,8 +730,7 @@ } } - if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == -1) - { + if (ngx_shutdown_socket(r->connection->fd, NGX_WRITE_SHUTDOWN) == -1) { ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_socket_errno, ngx_shutdown_socket_n " failed"); return ngx_http_close_request(r); @@ -749,7 +790,11 @@ timer = lcf->lingering_timeout; } - ngx_del_timer(ev); + if (ev->timer_set) { + ngx_del_timer(ev); + } else { + ev->timer_set = 1; + } ngx_add_timer(ev, timer); return NGX_OK;