diff src/event/ngx_event_accept.c @ 97:70d2345a903f

nginx-0.0.1-2003-05-29-17:02:09 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 29 May 2003 13:02:09 +0000
parents a23d010f356d
children c9b243802a17
line wrap: on
line diff
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -1,11 +1,9 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
 
 #include <nginx.h>
 
-#include <ngx_config.h>
-#include <ngx_core.h>
-#include <ngx_types.h>
-#include <ngx_log.h>
-#include <ngx_connection.h>
 #include <ngx_event.h>
 
 
@@ -19,18 +17,17 @@ void ngx_event_accept(ngx_event_t *ev)
     ngx_socket_t       s;
     ngx_event_t       *rev, *wev;
     ngx_connection_t  *c, *ls;
+    ngx_event_conf_t  *ecf;
 
-    ls = (ngx_connection_t *) ev->data;
+    ecf = ngx_event_get_conf(ngx_event_module);
+
+    ls = ev->data;
 
     ngx_log_debug(ev->log, "ngx_event_accept: accept ready: %d" _
                   ev->available);
 
     ev->ready = 0;
 
-#if 0
-/* DEBUG */ ev->available++;
-#endif
-
     do {
 
         /* Create the pool before accept() to avoid copy the sockaddr.
@@ -52,16 +49,37 @@ void ngx_event_accept(ngx_event_t *ev)
         s = accept(ls->fd, sa, &len);
         if (s == -1) {
             err = ngx_socket_errno;
-            ngx_destroy_pool(pool);
 
             if (err == NGX_EAGAIN) {
                 ngx_log_error(NGX_LOG_NOTICE, ev->log, err,
-                              "EAGAIN while accept %s", ls->addr_text.data);
+                              "EAGAIN while accept() %s", ls->addr_text.data);
                 return;
             }
 
             ngx_log_error(NGX_LOG_ALERT, ev->log, err,
-                          "accept %s failed", ls->addr_text.data);
+                          "accept() %s failed", ls->addr_text.data);
+
+            ngx_destroy_pool(pool);
+            return;
+        }
+
+        if (s >= ecf->connections) {
+
+            ngx_log_error(NGX_LOG_ALERT, ev->log, 0,
+                          "accept() %s returned socket #%d while "
+                          "only %d connections was configured, "
+                          "sleeping for 1 second",
+                          ls->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->addr_text.data);
+            }
+
+            sleep(1);
+
+            ngx_destroy_pool(pool);
             return;
         }
 
@@ -73,6 +91,14 @@ void ngx_event_accept(ngx_event_t *ev)
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_blocking_n " %s failed",
                                   ls->addr_text.data);
+
+                    if (ngx_close_socket(s) == -1) {
+                        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
+                                      ngx_close_socket_n " %s failed",
+                                      ls->addr_text.data);
+                    }
+
+                    ngx_destroy_pool(pool);
                     return;
                 }
             }
@@ -83,6 +109,14 @@ void ngx_event_accept(ngx_event_t *ev)
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_nonblocking_n " %s failed",
                                   ls->addr_text.data);
+
+                    if (ngx_close_socket(s) == -1) {
+                        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
+                                      ngx_close_socket_n " %s failed",
+                                      ls->addr_text.data);
+                    }
+
+                    ngx_destroy_pool(pool);
                     return;
                 }
             }
@@ -133,28 +167,28 @@ void ngx_event_accept(ngx_event_t *ev)
         ngx_memcpy(c->log, ev->log, sizeof(ngx_log_t));
         rev->log = wev->log = c->log;
 
-        /* STUB: x86: SP: xadd ?, MT: lock xadd, MP: lock xadd, shared */
+        /* STUB: x86: MT: lock xadd, MP: lock xadd, shared */
         c->number = ngx_connection_counter++;
 
-        ngx_log_debug(ev->log, "ngx_event_accept: accept: %d, %d" _
-                      s _ c->number);
+        ngx_log_debug(ev->log, "accept: %d, %d" _ s _ c->number);
 
-#if (HAVE_DEFERRED_ACCEPT)
-        if (ev->accept_filter) {
+        if (ev->deferred_accept) {
             rev->ready = 1;
         }
-#endif
 
-#if (HAVE_EDGE_EVENT) /* epoll */
+        if (ngx_add_conn) {
+            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->addr_text.data);
+                }
 
-        if (ngx_event_flags & NGX_HAVE_EDGE_EVENT) {
-            if (ngx_edge_add_event(ev) == NGX_ERROR) {
+                ngx_destroy_pool(pool);
                 return;
             }
         }
 
-#endif
-
         ls->handler(c);
 
         if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {