nginx-0.0.1-2003-05-29-17:02:09 import
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index c69427f..4bf1043 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -1,11 +1,9 @@
-#include <nginx.h>
-
#include <ngx_config.h>
#include <ngx_core.h>
-#include <ngx_types.h>
-#include <ngx_log.h>
-#include <ngx_connection.h>
+
+#include <nginx.h>
+
#include <ngx_event.h>
@@ -19,18 +17,17 @@
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 @@
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 @@
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 @@
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 @@
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) {