nginx-0.0.1-2003-06-11-19:28:34 import
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index 44c155e..004a3da 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -7,16 +7,13 @@
 #include <ngx_config.h>
 #include <ngx_core.h>
 #include <ngx_event.h>
-
-
-typedef struct {
-    int  threads;
-} ngx_iocp_conf_t;
+#include <ngx_iocp_module.h>
 
 
 static int ngx_iocp_init(ngx_log_t *log);
 static void ngx_iocp_done(ngx_log_t *log);
 static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key);
+static int ngx_iocp_del_connection(ngx_connection_t *c);
 static int ngx_iocp_process_events(ngx_log_t *log);
 static void *ngx_iocp_create_conf(ngx_pool_t *pool);
 static char *ngx_iocp_init_conf(ngx_pool_t *pool, void *conf);
@@ -33,6 +30,20 @@
      offsetof(ngx_iocp_conf_t, threads),
      NULL},
 
+    {ngx_string("acceptex"),
+     NGX_EVENT_CONF|NGX_CONF_TAKE1,
+     ngx_conf_set_num_slot,
+     0,
+     offsetof(ngx_iocp_conf_t, acceptex),
+     NULL},
+
+    {ngx_string("acceptex_read"),
+     NGX_EVENT_CONF|NGX_CONF_TAKE1,
+     ngx_conf_set_flag_slot,
+     0,
+     offsetof(ngx_iocp_conf_t, acceptex_read),
+     NULL},
+
     ngx_null_command
 };
 
@@ -48,7 +59,7 @@
         NULL,                              /* enable an event */
         NULL,                              /* disable an event */
         NULL,                              /* add an connection */
-        NULL,                              /* delete an connection */
+        ngx_iocp_del_connection,           /* delete an connection */
         ngx_iocp_process_events,           /* process the events */
         ngx_iocp_init,                     /* init the events */
         ngx_iocp_done                      /* done the events */
@@ -111,10 +122,13 @@
 
     c = (ngx_connection_t *) ev->data;
 
-    ngx_log_debug(ev->log, "iocp add: %d, %08x:%08x" _ c->fd _ key _ &ev->ovlp);
+    c->read->active = 1;
+    c->write->active = 1;
+
+    ngx_log_debug(ev->log, "iocp add: %d, %d:%08x" _ c->fd _ key _ &ev->ovlp);
 
     if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {
-        ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,
+        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
                       "CreateIoCompletionPort() failed");
         return NGX_ERROR;
     }
@@ -123,6 +137,17 @@
 }
 
 
+static int ngx_iocp_del_connection(ngx_connection_t *c)
+{
+    if (CancelIo((HANDLE) c->fd) == 0) {
+        ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");
+        return NGX_ERROR;
+    }
+
+    return NGX_OK;
+}
+
+
 static int ngx_iocp_process_events(ngx_log_t *log)
 {
     int                rc;
@@ -148,7 +173,7 @@
     rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key,
                                    (LPOVERLAPPED *) &ovlp, timer);
 
-    ngx_log_debug(log, "iocp: %d, %d:%08x:%08x" _ rc _ bytes _ key _ ovlp);
+    ngx_log_debug(log, "iocp: %d, %d, %d:%08x" _ rc _ bytes _ key _ ovlp);
 
     if (rc == 0) {
         err = ngx_errno;
@@ -179,13 +204,17 @@
         switch (key) {
         case NGX_IOCP_IO:
             ev->ready = 1;
-            ev->available = bytes;
             break;
 
         case NGX_IOCP_ACCEPT:
+            if (bytes) {
+                ev->ready = 1;
+            }
             break;
         }
 
+        ev->available = bytes;
+
 ngx_log_debug(log, "iocp ev handler: %08x" _ ev->event_handler);
 
         ev->event_handler(ev);
@@ -203,6 +232,8 @@
                   NGX_CONF_ERROR);
 
     cf->threads = NGX_CONF_UNSET;
+    cf->acceptex = NGX_CONF_UNSET;
+    cf->acceptex_read = NGX_CONF_UNSET;
 
     return cf;
 }
@@ -213,6 +244,8 @@
     ngx_iocp_conf_t *cf = conf;
 
     ngx_conf_init_value(cf->threads, 0);
+    ngx_conf_init_value(cf->acceptex, 10);
+    ngx_conf_init_value(cf->acceptex_read, 1);
 
     return NGX_CONF_OK;
 }
diff --git a/src/event/modules/ngx_iocp_module.h b/src/event/modules/ngx_iocp_module.h
index d7f2f51..7b61a46 100644
--- a/src/event/modules/ngx_iocp_module.h
+++ b/src/event/modules/ngx_iocp_module.h
@@ -2,14 +2,14 @@
 #define _NGX_IOCP_MODULE_H_INCLUDED_
 
 
-#include <ngx_types.h>
-#include <ngx_log.h>
-#include <ngx_event.h>
+typedef struct {
+    int  threads;
+    int  acceptex;
+    int  acceptex_read;
+} ngx_iocp_conf_t;
 
 
-int ngx_iocp_init(int max_connections, ngx_log_t *log);
-int ngx_iocp_add_event(ngx_event_t *ev);
-int ngx_iocp_process_events(ngx_log_t *log);
+extern ngx_module_t  ngx_iocp_module;
 
 
 #endif /* _NGX_IOCP_MODULE_H_INCLUDED_ */
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 6f12966..96a5d67 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -378,7 +378,9 @@
 
     ecf = ngx_event_get_conf(ngx_event_module);
 
-    if (ecf->connections > FD_SETSIZE) {
+    /* the default FD_SETSIZE is 1024U in FreeBSD 5.x */
+
+    if ((unsigned) ecf->connections > FD_SETSIZE) {
         return "maximum number of connections "
                "supported by select() is " ngx_value(FD_SETSIZE);
     }
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index f028f5d..b706979 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -1,8 +1,6 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_listen.h>
-#include <ngx_connection.h>
 #include <ngx_event.h>
 
 
@@ -23,11 +21,6 @@
 #include <ngx_aio_module.h>
 #endif
 
-#if (HAVE_IOCP)
-#include <ngx_event_acceptex.h>
-#include <ngx_iocp_module.h>
-#endif
-
 
 static char *ngx_events_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 static char *ngx_event_use(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
@@ -123,11 +116,14 @@
 int ngx_pre_thread(ngx_array_t *ls, ngx_pool_t *pool, ngx_log_t *log)
 {
     int                  m, i, fd;
-    ngx_listen_t        *s;
-    ngx_event_t         *ev;
+    ngx_event_t         *rev, *wev;
+    ngx_listening_t     *s;
     ngx_connection_t    *c;
     ngx_event_conf_t    *ecf;
     ngx_event_module_t  *module;
+#if (WIN32)
+    ngx_iocp_conf_t     *iocpcf;
+#endif
 
     ecf = ngx_event_get_conf(ngx_event_module);
 
@@ -161,71 +157,76 @@
                   NGX_ERROR);
 
     /* for each listening socket */
-    s = (ngx_listen_t *) ls->elts;
-    for (i = 0; i < ls->nelts; i++) {
+
+    for (s = ls->elts, i = 0; i < ls->nelts; i++) {
 
         fd = s[i].fd;
 
+#if (WIN32)
+        /*
+         * Winsock assignes a socket number divisible by 4
+         * so to find a connection we divide a socket number by 4.
+         */
+
+        c = &ngx_connections[fd / 4];
+        rev = &ngx_read_events[fd / 4];
+        wev = &ngx_write_events[fd / 4];
+#else
         c = &ngx_connections[fd];
-        ev = &ngx_read_events[fd];
+        rev = &ngx_read_events[fd];
+        wev = &ngx_write_events[fd];
+#endif
 
         ngx_memzero(c, sizeof(ngx_connection_t));
-        ngx_memzero(ev, sizeof(ngx_event_t));
+        ngx_memzero(rev, sizeof(ngx_event_t));
 
         c->fd = fd;
-        c->family = s[i].family;
-        c->socklen = s[i].socklen;
-        c->sockaddr = ngx_palloc(pool, s[i].socklen);
-        c->addr = s[i].addr;
-        c->addr_text = s[i].addr_text;
-        c->addr_text_max_len = s[i].addr_text_max_len;
-        c->post_accept_timeout = s[i].post_accept_timeout;
+        c->listening = &s[i];
 
-        c->handler = s[i].handler;
         c->ctx = s[i].ctx;
         c->servers = s[i].servers;
         c->log = s[i].log;
-        c->pool_size = s[i].pool_size;
 
-        ngx_test_null(ev->log,
-                      ngx_palloc(pool, sizeof(ngx_log_t)),
-                      NGX_ERROR);
+        ngx_test_null(rev->log, ngx_palloc(pool, sizeof(ngx_log_t)), NGX_ERROR);
 
-        ngx_memcpy(ev->log, c->log, sizeof(ngx_log_t));
-        c->read = ev;
-        ev->data = c;
-        ev->index = NGX_INVALID_INDEX;
+        ngx_memcpy(rev->log, c->log, sizeof(ngx_log_t));
+        c->read = rev;
+        c->write = wev;
+        rev->data = c;
+        rev->index = NGX_INVALID_INDEX;
 #if 0
-        ev->listening = 1;
+        rev->listening = 1;
 #endif
 
-        ev->available = 0;
+        rev->available = 0;
 
 #if (HAVE_DEFERRED_ACCEPT)
-        ev->deferred_accept = s[i].deferred_accept;
+        rev->deferred_accept = s[i].deferred_accept;
 #endif
 
-#if (HAVE_IOCP)
+#if (WIN32)
 
         if (ngx_event_flags & NGX_HAVE_IOCP_EVENT) {
-            ev->event_handler = &ngx_event_acceptex;
+            rev->event_handler = &ngx_event_acceptex;
 
-            /* LOOK: we call ngx_iocp_add_event() also
-               in ngx_event_post_acceptex() */
-            if (ngx_iocp_add_event(ev) == NGX_ERROR) {
+            if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {
                 return NGX_ERROR;
             }
 
-            ngx_event_post_acceptex(&s[i], 1);
+            iocpcf = ngx_event_get_conf(ngx_iocp_module);
+            if (ngx_event_post_acceptex(&s[i], iocpcf->acceptex) == NGX_ERROR) {
+                return NGX_ERROR;
+            }
 
         } else {
-            ev->event_handler = &ngx_event_accept;
+            rev->event_handler = &ngx_event_accept;
+            ngx_add_event(rev, NGX_READ_EVENT, 0);
         }
 
 #else
 
-        ev->event_handler = &ngx_event_accept;
-        ngx_add_event(ev, NGX_READ_EVENT, 0);
+        rev->event_handler = &ngx_event_accept;
+        ngx_add_event(rev, NGX_READ_EVENT, 0);
 
 #endif
     }
@@ -384,14 +385,6 @@
 
 #endif
 
-#if (WIN32)
-    /*
-     * Winsock assignes a socket number according to 4 * N + M,
-     * where M is the constant 32 (98SE), 88 (NT) or 100 (W2K).
-     * So to find a connection we divide a socket number by 4.
-     */
-#endif
-
     ngx_conf_init_value(ecf->timer_queues, 10);
 
     return NGX_CONF_OK;
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index f467cc7..9b6dd23 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -270,11 +270,6 @@
 #define ngx_del_conn         ngx_event_actions.del_conn
 
 #if 0
-#define ngx_add_timer        ngx_event_actions.timer
-#else
-#define ngx_add_timer        ngx_event_add_timer
-#endif
-
 #if (HAVE_IOCP_EVENT)
 #define ngx_event_recv       ngx_event_wsarecv
 #elif (HAVE_AIO_EVENT)
@@ -283,17 +278,33 @@
 #define ngx_event_recv       ngx_io.recv
 #define ngx_write_chain      ngx_io.send_chain
 #endif
+#endif
 
 #endif
 
 
+
+
+
+/* ***************************** */
+
+#define ngx_recv             ngx_io.recv
+#define ngx_write_chain      ngx_io.send_chain
+
+
+#define ngx_add_timer        ngx_event_add_timer
+#define ngx_del_timer        ngx_event_del_timer
+
+
 #if (HAVE_IOCP_EVENT)
 #define NGX_IOCP_ACCEPT      0
 #define NGX_IOCP_IO          1
 #endif
 
+/* ***************************** */
 
-#define ngx_del_timer        ngx_event_del_timer
+
+
 
 
 
@@ -309,6 +320,8 @@
 
 
 
+/* ***************************** */
+
 #define NGX_EVENT_MODULE      0x544E5645  /* "EVNT" */
 
 #define NGX_EVENT_CONF        0x00200000
@@ -342,6 +355,16 @@
 
 void ngx_event_accept(ngx_event_t *ev);
 
+#if (WIN32)
+void ngx_event_acceptex(ngx_event_t *ev);
+int ngx_event_post_acceptex(ngx_listening_t *ls, int n);
+#endif
+
+/* ***************************** */
+
+
+
+
 
 ssize_t ngx_event_recv_core(ngx_connection_t *c, char *buf, size_t size);
 int ngx_event_close_connection(ngx_event_t *ev);
@@ -351,7 +374,15 @@
 void ngx_worker(ngx_log_t *log);
 
 
+/* ***************************** */
+
+
 #include <ngx_event_timer.h>
+#if (WIN32)
+#include <ngx_iocp_module.h>
+#endif
+
+/* ***************************** */
 
 
 #endif /* _NGX_EVENT_H_INCLUDED_ */
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 6f6e5a4..7e87761 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -30,21 +30,23 @@
 
         /*
          * Create the pool before accept() to avoid copy the sockaddr.
-         * Although accept() can fail it's uncommon case
+         * Although accept() can fail it's an uncommon case
          * and the pool can be got from the free pool list
          */
 
-        pool = ngx_create_pool(ls->pool_size, ev->log);
+        pool = ngx_create_pool(ls->listening->pool_size, ev->log);
         if (pool == NULL) {
             return;
         }
 
-        sa = ngx_palloc(pool, ls->socklen);
+        sa = ngx_palloc(pool, ls->listening->socklen);
         if (sa == NULL) {
             return;
         }
 
-        len = ls->socklen;
+        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) {
@@ -52,12 +54,13 @@
 
             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->listening->addr_text.data);
                 return;
             }
 
             ngx_log_error(NGX_LOG_ALERT, ev->log, err,
-                          "accept() %s failed", ls->addr_text.data);
+                          "accept() %s failed", ls->listening->addr_text.data);
 
             ngx_destroy_pool(pool);
             return;
@@ -70,12 +73,12 @@
                           "accept() %s returned socket #%d while "
                           "only %d connections was configured, "
                           "sleeping for 1 second",
-                          ls->addr_text.data, s, ecf->connections);
+                          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->addr_text.data);
+                              ls->listening->addr_text.data);
             }
 
             ngx_msleep(1000);
@@ -91,12 +94,12 @@
                 if (ngx_blocking(s) == -1) {
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_blocking_n " %s failed",
-                                  ls->addr_text.data);
+                                  ls->listening->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);
+                                      ls->listening->addr_text.data);
                     }
 
                     ngx_destroy_pool(pool);
@@ -109,12 +112,12 @@
                 if (ngx_nonblocking(s) == -1) {
                     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,
                                   ngx_nonblocking_n " %s failed",
-                                  ls->addr_text.data);
+                                  ls->listening->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);
+                                      ls->listening->addr_text.data);
                     }
 
                     ngx_destroy_pool(pool);
@@ -123,9 +126,26 @@
             }
         }
 
+#if (WIN32)
+        /*
+         * Winsock assignes a socket number divisible by 4
+         * so to find a connection we divide a socket number by 4.
+         */
+
+        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];
+#else
         rev = &ngx_read_events[s];
         wev = &ngx_write_events[s];
         c = &ngx_connections[s];
+#endif
 
         instance = rev->instance;
 
@@ -135,12 +155,9 @@
 
         c->pool = pool;
 
+        c->listening = ls->listening;
         c->sockaddr = sa;
-        c->family = ls->family;
         c->socklen = len;
-        c->addr = ls->addr;
-        c->addr_text_max_len = ls->addr_text_max_len;
-        c->post_accept_timeout = ls->post_accept_timeout;
 
         rev->instance = wev->instance = !instance;
 
@@ -182,7 +199,7 @@
                 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);
+                                  ls->listening->addr_text.data);
                 }
 
                 ngx_destroy_pool(pool);
@@ -190,7 +207,7 @@
             }
         }
 
-        ls->handler(c);
+        ls->listening->handler(c);
 
         if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
             ev->available--;
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c
index 8ba56f3..04dddb1 100644
--- 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 @@
 
     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 @@
     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 @@
 
         /* 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 @@
         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);
+
+                return NGX_ERROR;
             }
-
-            ngx_log_error(NGX_LOG_ALERT, ls->log, err,
-                          "AcceptEx(%s) falied", ls->addr_text.data);
-
-            return NGX_ERROR;
         }
     }
 
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index 44fb14a..081afdb 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -1,14 +1,8 @@
 
 #include <ngx_config.h>
-
 #include <ngx_core.h>
-#include <ngx_log.h>
-#include <ngx_alloc.h>
-#include <ngx_connection.h>
 #include <ngx_event.h>
 
-#include <ngx_event_timer.h>
-
 
 static ngx_event_t  *ngx_timer_queue;
 static int           ngx_timer_cur_queue;
@@ -49,7 +43,7 @@
     ngx_event_t  *e;
 
 #if (NGX_DEBUG_EVENT)
-    ngx_connection_t *c = (ngx_connection_t *) ev->data;
+    ngx_connection_t *c = ev->data;
     ngx_log_debug(ev->log, "set timer: %d:%d, slot: %d" _
                   c->fd _ timer _ ngx_timer_cur_queue);
 #endif
diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h
index cb024a3..2704c58 100644
--- a/src/event/ngx_event_timer.h
+++ b/src/event/ngx_event_timer.h
@@ -3,9 +3,7 @@
 
 
 #include <ngx_config.h>
-
-#include <ngx_log.h>
-#include <ngx_connection.h>
+#include <ngx_core.h>
 #include <ngx_event.h>
 
 
@@ -20,8 +18,8 @@
 ngx_inline static void ngx_event_del_timer(ngx_event_t *ev)
 {
 #if (NGX_DEBUG_EVENT)
-    /* STUB - we can not cast (ngx_connection_t *) here */
-    ngx_log_debug(ev->log, "del timer: %d" _ *(int *)(ev->data));
+    ngx_connection_t *c = ev->data;
+    ngx_log_debug(ev->log, "del timer: %d" _ c->fd);
 #endif
 
     if (!ev->timer_next || !ev->timer_prev) {