Mercurial > hg > nginx
diff src/event/ngx_event_accept.c @ 248:e885208c518b
nginx-0.0.2-2004-02-03-00:19:52 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 02 Feb 2004 21:19:52 +0000 |
parents | 008276b9e061 |
children | b6793bc5034b |
line wrap: on
line diff
--- a/src/event/ngx_event_accept.c Sun Feb 01 08:10:52 2004 +0000 +++ b/src/event/ngx_event_accept.c Mon Feb 02 21:19:52 2004 +0000 @@ -23,6 +23,13 @@ ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); + if (ngx_event_flags & (NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) { + ev->available = 1; + + } else if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) { + ev->available = ecf->multi_accept; + } + ls = ev->data; ngx_log_debug(ev->log, "accept on %s ready: %d" _ @@ -31,26 +38,33 @@ ev->ready = 0; accepted = 0; + pool = NULL; do { - /* - * Create the pool before accept() to avoid copy the sockaddr. - * Although accept() can fail it's an uncommon case - * and besides the pool can be got from the free pool list - */ + if (pool == NULL) { - if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { - return; + /* + * Create the pool before accept() to avoid copy the sockaddr. + * Although accept() can fail it's an uncommon case + * and besides the pool can be got from the free pool list + */ + + if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { + return; + } } if (!(sa = ngx_palloc(pool, ls->listening->socklen))) { + ngx_destroy_pool(pool); return; } if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) { + ngx_destroy_pool(pool); return; } + ngx_memcpy(log, ls->log, sizeof(ngx_log_t)); pool->log = log; @@ -67,6 +81,8 @@ ngx_log_error(NGX_LOG_NOTICE, log, err, "EAGAIN after %d accepted connection(s)", accepted); + + ngx_destroy_pool(pool); return; } @@ -74,6 +90,17 @@ "accept() on %s failed", ls->listening->addr_text.data); + if (err == NGX_ECONNABORTED) { + if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { + ev->available--; + } + + if (ev->available) { + /* reuse the previously allocated pool */ + continue; + } + } + ngx_destroy_pool(pool); return; } @@ -187,8 +214,10 @@ wev->write = 1; wev->ready = 1; - if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) { - /* aio, iocp, epoll */ + if (ngx_event_flags + & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) + { + /* aio, iocp, sigio, epoll */ rev->ready = 1; } @@ -229,6 +258,8 @@ } } + pool = NULL; + log->data = NULL; log->handler = NULL;