summaryrefslogtreecommitdiffhomepage
path: root/src/event/ngx_event_accept.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/ngx_event_accept.c')
-rw-r--r--src/event/ngx_event_accept.c126
1 files changed, 75 insertions, 51 deletions
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index a4f7436e9..17f8899a5 100644
--- 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;
}
- sa = ngx_palloc(pool, ls->listening->socklen);
- if (sa == NULL) {
+ if (!(sa = ngx_palloc(pool, ls->listening->socklen))) {
return;
}
- len = ls->listening->socklen;
+ if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) {
+ return;
+ }
+ ngx_memcpy(log, ls->log, sizeof(ngx_log_t));
+ pool->log = log;
-ngx_log_debug(ev->log, "ADDR %s" _ ls->listening->addr_text.data);
+ log->data = ls->listening->addr_text.data;
+ log->handler = ngx_accept_log_error;
+
+ len = ls->listening->socklen;
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->listening->addr_text.data);
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->listening->addr_text.data);
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->listening->addr_text.data);
} 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->listening->addr_text.data);
*/
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->listening->addr_text.data);
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 = c;
+ wev->data = c;
- rev->data = 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->listening->addr_text.data);
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->listening->addr_text.data);
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->listening->addr_text.data);
}
}
+ 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);
+}