diff src/event/ngx_event_acceptex.c @ 103:6dfda4cf5200

nginx-0.0.1-2003-06-11-19:28:34 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 11 Jun 2003 15:28:34 +0000
parents 7e86d028d8f0
children ac69ab96328d
line wrap: on
line diff
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -1,14 +1,8 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-
-#include <ngx_listen.h>
-
 #include <ngx_event.h>
-#if 0
-#include <ngx_event_close.h>
-#include <ngx_iocp_module.h>
-#endif
+#include <nginx.h>
 
 
 void ngx_event_acceptex(ngx_event_t *rev)
@@ -17,11 +11,9 @@ void ngx_event_acceptex(ngx_event_t *rev
 
     c = (ngx_connection_t *) rev->data;
 
-ngx_log_debug(rev->log, "ADDR: %s" _ c->addr_text.data);
-
     if (rev->ovlp.error) {
-        ngx_log_error(NGX_LOG_CRIT, rev->log, rev->ovlp.error,
-                      "AcceptEx() failed for %s", c->addr_text.data);
+        ngx_log_error(NGX_LOG_CRIT, c->log, rev->ovlp.error,
+                      "AcceptEx() %s failed", c->listening->addr_text.data);
         return;
     }
 
@@ -30,36 +22,45 @@ ngx_log_debug(rev->log, "ADDR: %s" _ c->
     if (setsockopt(c->fd, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT,
                    (char *)&c->listening->fd, sizeof(ngx_socket_t)) == -1)
     {
-        ngx_log_error(NGX_LOG_CRIT, ev->log, ngx_socket_errno,
+        ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
                       "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed for %s",
                       c->addr_text.data);
     } else {
-        accept_context_updated = 1;
+        c->accept_context_updated = 1;
     }
 
-    getacceptexsockaddrs(c->data, 0,
-                         c->socklen + 16, c->socklen + 16,
+    getacceptexsockaddrs(c->buffer->pos, c->listening->post_accept_buffer_size,
+                         c->listening->socklen + 16,
+                         c->listening->socklen + 16,
                          &c->local_sockaddr, &c->local_socklen,
                          &c->sockaddr, &c->socklen);
 
+    if (c->listening->post_accept_buffer_size) {
+        c->buffer->last += rev->available;
+        c->buffer->end = c->buffer->start
+                                       + c->listening->post_accept_buffer_size;
+
+    } else {
+        c->buffer = NULL;
+    }
+
     ngx_event_post_acceptex(c->listening, 1);
 
-    /* STUB: InterlockedInc() */
+    /* TODO: MT */
     c->number = ngx_connection_counter++;
 
-    c->handler(c);
+    c->listening->handler(c);
 
     return;
 
 }
 
 
-int ngx_event_post_acceptex(ngx_listen_t *ls, int n)
+int ngx_event_post_acceptex(ngx_listening_t *ls, int n)
 {
     int                i;
     u_int              rcvd;
     ngx_err_t          err;
-    ngx_pool_t        *pool;
     ngx_event_t       *rev, *wev;
     ngx_socket_t       s;
     ngx_connection_t  *c;
@@ -68,29 +69,36 @@ int ngx_event_post_acceptex(ngx_listen_t
 
         /* TODO: look up reused sockets */
 
-        ngx_log_debug(ls->log, "socket: %x" _ ls->flags);
-
         s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags);
+        ngx_log_debug(ls->log, ngx_socket_n ": %d:%d" _ s _ ls->flags);
 
         if (s == -1) {
             ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno,
-                          ngx_socket_n " for AcceptEx() post failed");
+                          ngx_socket_n " for AcceptEx() %s post failed",
+                          ls->addr_text.data);
 
             return NGX_ERROR;
         }
 
-        ngx_test_null(pool, ngx_create_pool(ls->pool_size, ls->log), NGX_ERROR);
+        /*
+         * Winsock assignes a socket number divisible by 4
+         * so to find a connection we divide a socket number by 4.
+         */
 
-        rev = &ngx_read_events[s];
-        wev = &ngx_write_events[s];
-        c = &ngx_connections[s];
+        if (s % 4) {
+            ngx_log_error(NGX_LOG_EMERG, ls->log, 0,
+                          ngx_socket_n " created socket %d", s);
+            exit(1);
+        }
+
+        rev = &ngx_read_events[s / 4];
+        wev = &ngx_write_events[s / 4];
+        c = &ngx_connections[s / 4];
 
         ngx_memzero(rev, sizeof(ngx_event_t));
         ngx_memzero(wev, sizeof(ngx_event_t));
         ngx_memzero(c, sizeof(ngx_connection_t));
 
-        c->pool = pool;
-
         rev->index = wev->index = NGX_INVALID_INDEX;
 
         rev->ovlp.event = rev;
@@ -100,53 +108,55 @@ int ngx_event_post_acceptex(ngx_listen_t
         c->read = rev;
         c->write = wev;
 
-        c->family = ls->family;
-        c->socklen = ls->socklen;
-        c->addr = ls->addr;
-        c->addr_text_max_len = ls->addr_text_max_len;
-        c->post_accept_timeout = ls->post_accept_timeout;
-
         c->listening = ls;
         c->fd = s;
 
-        c->unexpected_eof = 1;
-        wev->write = 1;
-
-        c->handler = ls->handler;
-        rev->event_handler = ngx_event_acceptex;
-
         c->ctx = ls->ctx;
         c->servers = ls->servers;
 
-        ngx_test_null(c->data, ngx_palloc(pool, 2 * (c->socklen + 16)),
+        c->unexpected_eof = 1;
+        wev->write = 1;
+        rev->event_handler = ngx_event_acceptex;
+
+        ngx_test_null(c->pool,
+                      ngx_create_pool(ls->pool_size, ls->log),
                       NGX_ERROR);
-        ngx_test_null(c->local_sockaddr, ngx_palloc(pool, c->socklen),
+
+        ngx_test_null(c->buffer,
+                      ngx_create_temp_hunk(c->pool,
+                                           ls->post_accept_buffer_size
+                                           + 2 * (c->listening->socklen + 16),
+                                           0, 0),
                       NGX_ERROR);
-        ngx_test_null(c->sockaddr, ngx_palloc(pool, c->socklen),
+
+        ngx_test_null(c->local_sockaddr, ngx_palloc(c->pool, ls->socklen),
+                      NGX_ERROR);
+
+        ngx_test_null(c->sockaddr, ngx_palloc(c->pool, ls->socklen),
                       NGX_ERROR);
 
         ngx_test_null(c->log, ngx_palloc(c->pool, sizeof(ngx_log_t)),
                       NGX_ERROR);
+
         ngx_memcpy(c->log, ls->log, sizeof(ngx_log_t));
-        rev->log = wev->log = c->log;
+        c->read->log = c->write->log = c->log;
 
         if (ngx_add_event(rev, 0, NGX_IOCP_IO) == NGX_ERROR) {
             return NGX_ERROR;
         }
 
-        if (acceptex(ls->fd, s, c->data, 0,
-                     c->socklen + 16, c->socklen + 16,
-                     &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0) {
+        if (acceptex(ls->fd, s, c->buffer->pos, ls->post_accept_buffer_size,
+                     ls->socklen + 16, ls->socklen + 16,
+                     &rcvd, (LPOVERLAPPED) &rev->ovlp) == 0)
+        {
 
             err = ngx_socket_errno;
-            if (err == WSA_IO_PENDING) {
-                return NGX_OK;
-            }
+            if (err != WSA_IO_PENDING) {
+                ngx_log_error(NGX_LOG_ALERT, ls->log, err,
+                              "AcceptEx() %s falied", ls->addr_text.data);
 
-            ngx_log_error(NGX_LOG_ALERT, ls->log, err,
-                          "AcceptEx(%s) falied", ls->addr_text.data);
-
-            return NGX_ERROR;
+                return NGX_ERROR;
+            }
         }
     }