Mercurial > hg > nginx-quic
diff src/event/ngx_event_accept.c @ 191:71ce40b3c37b
nginx-0.0.1-2003-11-19-19:26:41 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Wed, 19 Nov 2003 16:26:41 +0000 |
parents | 84036764e215 |
children | 31824be1fc66 |
line wrap: on
line diff
--- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -5,62 +5,74 @@ #include <nginx.h> +static size_t ngx_accept_log_error(void *data, char *buf, size_t len); + + void ngx_event_accept(ngx_event_t *ev) { - int instance; - socklen_t len; - struct sockaddr *sa; - ngx_err_t err; - ngx_pool_t *pool; - ngx_socket_t s; - ngx_event_t *rev, *wev; - ngx_connection_t *c, *ls; - ngx_event_conf_t *ecf; + int instance, accepted; + socklen_t len; + struct sockaddr *sa; + ngx_err_t err; + ngx_log_t *log; + ngx_pool_t *pool; + ngx_socket_t s; + ngx_event_t *rev, *wev; + ngx_connection_t *c, *ls; + ngx_event_conf_t *ecf; ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module); ls = ev->data; - ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _ + ngx_log_debug(ev->log, "accept on %s ready: %d" _ + ls->listening->addr_text.data _ ev->available); ev->ready = 0; + accepted = 0; do { /* * Create the pool before accept() to avoid copy the sockaddr. * Although accept() can fail it's an uncommon case - * and the pool can be got from the free pool list + * and besides the pool can be got from the free pool list */ - pool = ngx_create_pool(ls->listening->pool_size, ev->log); - if (pool == NULL) { + if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) { + return; + } + + if (!(sa = ngx_palloc(pool, ls->listening->socklen))) { return; } - sa = ngx_palloc(pool, ls->listening->socklen); - if (sa == NULL) { + if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) { return; } + ngx_memcpy(log, ls->log, sizeof(ngx_log_t)); + pool->log = log; + + log->data = ls->listening->addr_text.data; + log->handler = ngx_accept_log_error; len = ls->listening->socklen; -ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data); - s = accept(ls->fd, sa, &len); if (s == -1) { err = ngx_socket_errno; if (err == NGX_EAGAIN) { - ngx_log_error(NGX_LOG_NOTICE, ev->log, err, - "EAGAIN while accept() %s", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_NOTICE, log, err, + "EAGAIN after %d accepted connection(s)", + accepted); return; } ngx_log_error(NGX_LOG_ALERT, ev->log, err, - "accept() %s failed", ls->listening->addr_text.data); + "accept() on %s failed", + ls->listening->addr_text.data); ngx_destroy_pool(pool); return; @@ -71,15 +83,14 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l if ((unsigned) s >= (unsigned) ecf->connections) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, - "accept() %s returned socket #%d while " + "accept() on %s returned socket #%d while " "only %d connections was configured, " "sleeping for 1 second", ls->listening->addr_text.data, s, ecf->connections); if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_close_socket_n " %s failed", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_close_socket_n "failed"); } ngx_msleep(1000); @@ -93,14 +104,12 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l if (ngx_inherited_nonblocking) { if ((ngx_event_flags & NGX_USE_AIO_EVENT)) { if (ngx_blocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_blocking_n " %s failed", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_blocking_n " failed"); if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_close_socket_n " %s failed", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_close_socket_n " failed"); } ngx_destroy_pool(pool); @@ -111,14 +120,12 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l } else { if ((ngx_event_flags & NGX_USE_AIO_EVENT) == 0) { if (ngx_nonblocking(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_nonblocking_n " %s failed", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_nonblocking_n " failed"); if (ngx_close_socket(s) == -1) { - ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_close_socket_n " %s failed", - ls->listening->addr_text.data); + ngx_log_error(NGX_LOG_ALERT, log, ngx_socket_errno, + ngx_close_socket_n " failed"); } ngx_destroy_pool(pool); @@ -134,9 +141,10 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l */ if (s % 4) { - ngx_log_error(NGX_LOG_EMERG, ls->log, 0, - ngx_socket_n - " created socket %d, not divisible by 4", s); + ngx_log_error(NGX_LOG_EMERG, ev->log, 0, + "accept() on %s returned socket #%d, " + "not divisible by 4", + ls->listening->addr_text.data, s); exit(1); } @@ -161,16 +169,21 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l c->sockaddr = sa; c->socklen = len; - rev->instance = wev->instance = !instance; + rev->instance = !instance; + wev->instance = !instance; - rev->index = wev->index = NGX_INVALID_INDEX; + rev->index = NGX_INVALID_INDEX; + wev->index = NGX_INVALID_INDEX; - rev->data = wev->data = c; + rev->data = c; + wev->data = c; + c->read = rev; c->write = wev; c->fd = s; c->unexpected_eof = 1; + wev->write = 1; wev->ready = 1; @@ -182,12 +195,9 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l c->ctx = ls->ctx; c->servers = ls->servers; - c->log = ngx_palloc(c->pool, sizeof(ngx_log_t)); - if (c->log == NULL) { - return; - } - ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t)); - rev->log = wev->log = c->log; + c->log = log; + rev->log = log; + wev->log = log; /* TODO: x86: MT: lock xadd, MP: lock xadd, shared */ c->number = ngx_connection_counter++; @@ -202,8 +212,7 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l if (ngx_add_conn(c) == NGX_ERROR) { if (ngx_close_socket(s) == -1) { ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno, - ngx_close_socket_n " %s failed", - ls->listening->addr_text.data); + ngx_close_socket_n " failed"); } ngx_destroy_pool(pool); @@ -211,13 +220,28 @@ ngx_log_debug(ev->log, "ADDR %s" _ ls->l } } + log->data = NULL; + log->handler = NULL; + ls->listening->handler(c); +#if 0 if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) { ev->available--; } +#endif + + accepted++; } while (ev->available); return; } + + +static size_t ngx_accept_log_error(void *data, char *buf, size_t len) +{ + char *sock = data; + + return ngx_snprintf(buf, len, " while accept() on %s", sock); +}