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);
+}