Mercurial > hg > nginx
diff src/http/ngx_http_event.c @ 60:50186b49f2ad
nginx-0.0.1-2003-02-11-10:14:40 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Tue, 11 Feb 2003 07:14:40 +0000 |
parents | e8cdc2989cee |
children | 34d647deb1da |
line wrap: on
line diff
--- a/src/http/ngx_http_event.c +++ b/src/http/ngx_http_event.c @@ -30,6 +30,7 @@ static int ngx_http_event_request_handle static int ngx_http_writer(ngx_event_t *ev); static int ngx_http_block_read(ngx_event_t *ev); static int ngx_http_read_discarded_body(ngx_event_t *ev); +static int ngx_http_set_keepalive(ngx_http_request_t *r); static int ngx_http_keepalive_handler(ngx_event_t *ev); static int ngx_http_set_lingering_close(ngx_http_request_t *r); static int ngx_http_lingering_close_handler(ngx_event_t *ev); @@ -112,10 +113,11 @@ int ngx_http_init_connection(ngx_connect #endif +/* THINK: should ngx_edge_add_event() be moved to accept part ? */ #if (HAVE_EDGE_EVENT) /* epoll */ if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { - if (ngx_add_event(ev, NGX_READ_EVENT, NGX_EDGE_EVENT) == NGX_ERROR) { + if (ngx_edge_add_event(ev) == NGX_ERROR) { return NGX_ERROR; } return ngx_http_init_request(ev); @@ -129,7 +131,7 @@ int ngx_http_init_connection(ngx_connect return ngx_http_init_request(ev); } -#endif /* HAVE_AIO_EVENT */ +#endif /* select, poll, /dev/poll */ @@ -498,9 +500,9 @@ static int ngx_http_event_request_handle #else -#if (HAVE_AIO_EVENT) /* aio, iocp */ +#if (HAVE_AIO_EVENT) || (HAVE_EDGE_EVENT) /* aio, iocp, epoll */ - if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { + if (ngx_event_flags & (NGX_HAVE_AIO_EVENT|NGX_HAVE_EDGE_EVENT)) { return rc; } @@ -512,30 +514,14 @@ static int ngx_http_event_request_handle event = NGX_CLEAR_EVENT; } else { - event = NGX_ONESHOT_EVENT; - } - -#elif (HAVE_EDGE_EVENT) /* epoll */ - - if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) { - event = NGX_EDGE_EVENT; - - } else { - event = NGX_ONESHOT_EVENT; + event = NGX_LEVEL_EVENT; + r->write_level_event = 1; } -#elif (HAVE_DEVPOLL_EVENT) /* /dev/poll */ - - if (ngx_event_flags & NGX_HAVE_LEVEL_EVENT) { - event = NGX_LEVEL_EVENT; +#else /* select, poll, /dev/poll */ - } else { - event = NGX_ONESHOT_EVENT; - } - -#else /* select, poll */ - - event = NGX_ONESHOT_EVENT; + event = NGX_LEVEL_EVENT; + r->write_level_event = 1; #endif @@ -571,13 +557,7 @@ static int ngx_http_event_request_handle /* keepalive */ - r->connection->buffer->pos.mem = r->connection->buffer->last.mem - = r->connection->buffer->start; - rev->event_handler = ngx_http_keepalive_handler; - - ngx_http_close_request(r); - - return NGX_OK; + return ngx_http_set_keepalive(r); } @@ -617,14 +597,6 @@ static int ngx_http_writer(ngx_event_t * ngx_add_timer(ev, timeout); } - /* TODO: /dev/poll, epoll, aio_write */ - - if (ev->oneshot) - if (ngx_add_event(ev, NGX_WRITE_EVENT, NGX_ONESHOT_EVENT) - == NGX_ERROR) { - return ngx_http_close_request(r); - } - return rc; } @@ -646,15 +618,11 @@ static int ngx_http_writer(ngx_event_t * /* keepalive */ - c->buffer->pos.mem = c->buffer->last.mem = c->buffer->start; - c->read->event_handler = ngx_http_keepalive_handler; - - ngx_http_close_request(r); - - return NGX_OK; + return ngx_http_set_keepalive(r); } +/* TODO */ static int ngx_http_block_read(ngx_event_t *ev) { ngx_log_debug(ev->log, "http read blocked"); @@ -693,6 +661,7 @@ static int ngx_http_block_read(ngx_event } +/* TODO */ int ngx_http_discard_body(ngx_http_request_t *r) { ngx_event_t *ev; @@ -716,6 +685,7 @@ int ngx_http_discard_body(ngx_http_reque } +/* TODO */ static int ngx_http_read_discarded_body(ngx_event_t *ev) { size_t size; @@ -757,6 +727,34 @@ static int ngx_http_read_discarded_body( } +/* TODO: if c->read->blocked */ +static int ngx_http_set_keepalive(ngx_http_request_t *r) +{ + ngx_connection_t *c; + + c = (ngx_connection_t *) r->connection; + + c->buffer->pos.mem = c->buffer->last.mem = c->buffer->start; + c->read->event_handler = ngx_http_keepalive_handler; + + if (r->write_level_event) { + if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) == NGX_ERROR) { + return NGX_ERROR; + } + } + + ngx_http_close_request(r); + +#if (HAVE_AIO_EVENT) /* aio, iocp */ + if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { + return ngx_http_keepalive_handler(c->read); + } +#endif + + return NGX_OK; +} + + static int ngx_http_keepalive_handler(ngx_event_t *ev) { ssize_t n; @@ -796,8 +794,10 @@ static int ngx_http_keepalive_handler(ng static int ngx_http_set_lingering_close(ngx_http_request_t *r) { ngx_event_t *ev; + ngx_connection_t *c; ngx_http_core_loc_conf_t *lcf; + c = r->connection; ev = r->connection->read; lcf = (ngx_http_core_loc_conf_t *) @@ -832,7 +832,21 @@ static int ngx_http_set_lingering_close( return ngx_http_close_request(r); } - return NGX_OK; +#if (HAVE_AIO_EVENT) /* aio, iocp */ + if (ngx_event_flags & NGX_HAVE_AIO_EVENT) { + return ngx_http_lingering_close_handler(ev); + } +#endif + +#if (HAVE_CLEAR_EVENT) || (HAVE_EDGE_EVENT) /* kqueue, epoll */ + if (ngx_event_flags & (NGX_HAVE_CLEAR_EVENT|NGX_HAVE_EDGE_EVENT)) { + return NGX_OK; + } +#endif + + /* select, poll, /dev/poll */ + + return ngx_del_event(c->write, NGX_WRITE_EVENT, 0); }