nginx-0.0.1-2003-05-20-19:37:55 import
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index fbbcf59..72efda4 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -1,47 +1,122 @@
+
 /*
- * Copyright (C) 2002 Igor Sysoev, http://sysoev.ru
+ * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru
  */
 
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_types.h>
-#include <ngx_log.h>
 #include <ngx_connection.h>
 #include <ngx_event.h>
-#include <ngx_event_timer.h>
-#include <ngx_devpoll_module.h>
 
-#if (USE_DEVPOLL) && !(HAVE_DEVPOLL)
-#error "/dev/poll is not supported on this platform"
+
+#if (TEST_DEVPOLL)
+
+/* Solaris declarations */
+
+#define POLLREMOVE   0x0800
+#define DP_POLL      0xD001
+
+struct dvpoll {
+    struct pollfd  *dp_fds;
+    int             dp_nfds;
+    int             dp_timeout;
+};
+
 #endif
 
+
+typedef struct {
+    int   changes;
+    int   events;
+} ngx_devpoll_conf_t;
+
+
+static int ngx_devpoll_init(ngx_log_t *log);
+static void ngx_devpoll_done(ngx_log_t *log);
+static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags);
+static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags);
 static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags);
+static int ngx_devpoll_process_events(ngx_log_t *log);
+
+static void *ngx_devpoll_create_conf(ngx_pool_t *pool);
+static char *ngx_devpoll_init_conf(ngx_pool_t *pool, void *conf);
 
 /* STUB */
 #define DEVPOLL_NCHANGES  512
 #define DEVPOLL_NEVENTS   512
 
-/* should be per-thread */
 static int              dp;
 static struct pollfd   *change_list, *event_list;
-static unsigned int     nchanges;
+static u_int            nchanges, max_changes;
 static int              nevents;
 
 static ngx_event_t    **change_index;
 
-static ngx_event_t     *timer_queue;
-/* */
+
+static ngx_str_t      devpoll_name = ngx_string("/dev/poll");
+
+static ngx_command_t  ngx_devpoll_commands[] = {
+
+    {ngx_string("devpoll_changes"),
+     NGX_EVENT_CONF|NGX_CONF_TAKE1,
+     ngx_conf_set_num_slot,
+     0,
+     offsetof(ngx_devpoll_conf_t, changes),
+     NULL},
+
+    {ngx_string("devpoll_events"),
+     NGX_EVENT_CONF|NGX_CONF_TAKE1,
+     ngx_conf_set_num_slot,
+     0,
+     offsetof(ngx_devpoll_conf_t, events),
+     NULL},
+
+    {ngx_string(""), 0, NULL, 0, 0, NULL}
+};
 
 
-int ngx_devpoll_init(int max_connections, ngx_log_t *log)
+ngx_event_module_t  ngx_devpoll_module_ctx = {
+    NGX_EVENT_MODULE,
+    &devpoll_name,
+    ngx_devpoll_create_conf,               /* create configuration */
+    ngx_devpoll_init_conf,                 /* init configuration */
+
+    {
+        ngx_devpoll_add_event,             /* add an event */
+        ngx_devpoll_del_event,             /* delete an event */
+        ngx_devpoll_add_event,             /* enable an event */
+        ngx_devpoll_del_event,             /* disable an event */
+        NULL,                              /* add an connection */
+        NULL,                              /* delete an connection */
+        ngx_devpoll_process_events,        /* process the events */
+        ngx_devpoll_init,                  /* init the events */
+        ngx_devpoll_done,                  /* done the events */
+    }
+
+};
+
+ngx_module_t  ngx_devpoll_module = {
+    &ngx_devpoll_module_ctx,               /* module context */
+    0,                                     /* module index */
+    ngx_devpoll_commands,                  /* module directives */
+    NGX_EVENT_MODULE_TYPE,                 /* module type */
+    NULL                                   /* init module */
+};
+
+
+static int ngx_devpoll_init(ngx_log_t *log)
 {
-    int  change_size, event_size;
+    ngx_devpoll_conf_t  *dpcf;
 
-    nevents = DEVPOLL_NEVENTS;
+    dpcf = ngx_event_get_conf(ngx_devpoll_module_ctx);
+
+ngx_log_debug(log, "CH: %d" _ dpcf->changes);
+ngx_log_debug(log, "EV: %d" _ dpcf->events);
+
+    max_changes = dpcf->changes;
+    nevents = dpcf->events;
     nchanges = 0;
-    change_size = sizeof(struct pollfd) * DEVPOLL_NCHANGES;
-    event_size = sizeof(struct pollfd) * DEVPOLL_NEVENTS;
 
     dp = open("/dev/poll", O_RDWR);
 
@@ -50,29 +125,45 @@
         return NGX_ERROR;
     }
 
-    ngx_test_null(change_list, ngx_alloc(change_size, log), NGX_ERROR);
-    ngx_test_null(event_list, ngx_alloc(event_size, log), NGX_ERROR);
-    ngx_test_null(change_index,
-                  ngx_alloc(sizeof(ngx_event_t *) * DEVPOLL_NCHANGES, log),
+    ngx_test_null(change_list,
+                  ngx_alloc(sizeof(struct pollfd) * dpcf->changes, log),
                   NGX_ERROR);
 
-    timer_queue = ngx_event_init_timer(log);
-    if (timer_queue == NULL) {
+    ngx_test_null(event_list,
+                  ngx_alloc(sizeof(struct pollfd) * dpcf->events, log),
+                  NGX_ERROR);
+
+    ngx_test_null(change_index,
+                  ngx_alloc(sizeof(ngx_event_t *) * dpcf->changes, log),
+                  NGX_ERROR);
+
+    if (ngx_event_timer_init(log) == NGX_ERROR) {
         return NGX_ERROR;
     }
 
-#if !(USE_DEVPOLL)
-    ngx_event_actions.add = ngx_devpoll_add_event;
-    ngx_event_actions.del = ngx_devpoll_del_event;
-    ngx_event_actions.timer = ngx_event_add_timer;
-    ngx_event_actions.process = ngx_devpoll_process_events;
-#endif
+    ngx_event_actions = ngx_devpoll_module_ctx.actions;
+    ngx_event_flags = NGX_HAVE_LEVEL_EVENT|NGX_USE_LEVEL_EVENT;
 
     return NGX_OK;
 }
 
 
-int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags)
+static void ngx_devpoll_done(ngx_log_t *log)
+{
+    if (close(dp) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno, "close(/dev/poll) failed");
+    }
+
+    ngx_event_timer_done(log);
+
+    ngx_free(change_list);
+    ngx_free(event_list);
+    ngx_free(change_index);
+
+}
+
+
+static int ngx_devpoll_add_event(ngx_event_t *ev, int event, u_int flags)
 {
 #if (NGX_DEBUG_EVENT)
     ngx_connection_t *c = (ngx_connection_t *) ev->data;
@@ -94,13 +185,11 @@
 #endif
 
     ev->active = 1;
-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
-
     return ngx_devpoll_set_event(ev, event, 0);
 }
 
 
-int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags)
+static int ngx_devpoll_del_event(ngx_event_t *ev, int event, u_int flags)
 {
     ngx_event_t  *e;
 
@@ -143,14 +232,14 @@
     int  n;
     ngx_connection_t  *c;
 
-    c = (ngx_connection_t *) ev->data;
+    c = ev->data;
 
 #if (NGX_DEBUG_EVENT)
     ngx_log_debug(ev->log, "devpoll fd:%d event:%d flush:%d" _
                            c->fd _ event _ flags);
 #endif
 
-    if (nchanges >= DEVPOLL_NCHANGES) {
+    if (nchanges >= max_changes) {
         ngx_log_error(NGX_LOG_WARN, ev->log, 0,
                       "/dev/pool change list is filled up");
 
@@ -266,15 +355,7 @@
             }
 
             c->read->ready = 1;
-
-            if (c->read->oneshot) {
-                ngx_del_timer(c->read);
-                ngx_devpoll_del_event(c->read, NGX_READ_EVENT, 0);
-            }
-
-            if (c->read->event_handler(c->read) == NGX_ERROR) {
-                c->read->close_handler(c->read);
-            }   
+            c->read->event_handler(c->read);
         }
 
         if (event_list[i].revents & POLLOUT) {
@@ -283,15 +364,7 @@
             }
 
             c->write->ready = 1;
-
-            if (c->write->oneshot) {
-                ngx_del_timer(c->write);
-                ngx_devpoll_del_event(c->write, NGX_WRITE_EVENT, 0);
-            }
-
-            if (c->write->event_handler(c->write) == NGX_ERROR) {
-                c->write->close_handler(c->write);
-            }   
+            c->write->event_handler(c->write);
         }
 
         if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
@@ -308,3 +381,28 @@
 
     return NGX_OK;
 }
+
+
+static void *ngx_devpoll_create_conf(ngx_pool_t *pool)
+{
+    ngx_devpoll_conf_t  *dpcf;
+
+    ngx_test_null(dpcf, ngx_palloc(pool, sizeof(ngx_devpoll_conf_t)),
+                  NGX_CONF_ERROR);
+
+    dpcf->changes = NGX_CONF_UNSET;
+    dpcf->events = NGX_CONF_UNSET;
+
+    return dpcf;
+}
+
+
+static char *ngx_devpoll_init_conf(ngx_pool_t *pool, void *conf)
+{
+    ngx_devpoll_conf_t *dpcf = conf;
+
+    ngx_conf_init_value(dpcf->changes, 512);
+    ngx_conf_init_value(dpcf->events, 512);
+
+    return NGX_CONF_OK;
+}
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index a84daa8..46f09a6 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -126,9 +126,7 @@
 
 ngx_log_debug(log, "iocp ev: %08x" _ ev->event_handler);
 
-        if (ev->event_handler(ev) == NGX_ERROR) {
-            ev->close_handler(ev);
-        }
+        ev->event_handler(ev);
     }
 
     return NGX_OK;
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index bf03f5c..81475f7 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -147,7 +147,7 @@
     ngx_connection_t  *c;
 
     ev->active = 1;
-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
+    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
 
     if (nchanges > 0
         && ev->index < nchanges
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index c58c898..5ca6e93 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -1,63 +1,114 @@
 
+/*
+ * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru
+ */
+
+
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_types.h>
-#include <ngx_errno.h>
-#include <ngx_log.h>
-#include <ngx_time.h>
 #include <ngx_connection.h>
 #include <ngx_event.h>
-#include <ngx_event_timer.h>
-#include <ngx_poll_module.h>
 
 
-/* should be per-thread */
+static int ngx_poll_init(ngx_log_t *log);
+static void ngx_poll_done(ngx_log_t *log);
+static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags);
+static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags);
+static int ngx_poll_process_events(ngx_log_t *log);
+
+
 static struct pollfd  *event_list;
 static u_int           nevents;
 
 static ngx_event_t   **event_index;
 static ngx_event_t   **ready_index;
-static ngx_event_t    *timer_queue;
-/* */
 
-int ngx_poll_init(int max_connections, ngx_log_t *log)
+
+static ngx_str_t    poll_name = ngx_string("poll");
+
+ngx_event_module_t  ngx_poll_module_ctx = {
+    NGX_EVENT_MODULE,
+    &poll_name,
+    NULL,                                  /* create configuration */
+    NULL,                                  /* init configuration */
+
+    {
+        ngx_poll_add_event,                /* add an event */
+        ngx_poll_del_event,                /* delete an event */
+        ngx_poll_add_event,                /* enable an event */
+        ngx_poll_del_event,                /* disable an event */
+        NULL,                              /* add an connection */
+        NULL,                              /* delete an connection */
+        ngx_poll_process_events,           /* process the events */
+        ngx_poll_init,                     /* init the events */
+        ngx_poll_done                      /* done the events */
+    }
+
+};
+
+ngx_module_t  ngx_poll_module = {
+    &ngx_poll_module_ctx,                  /* module context */
+    0,                                     /* module index */
+    NULL,                                  /* module directives */
+    NGX_EVENT_MODULE_TYPE,                 /* module type */
+    NULL                                   /* init module */
+};
+
+
+
+static int ngx_poll_init(ngx_log_t *log)
 {
+    ngx_event_conf_t  *ecf;
+
+    ecf = ngx_event_get_conf(ngx_event_module_ctx);
+
     ngx_test_null(event_list,
-                  ngx_alloc(sizeof(struct pollfd) * max_connections, log),
+                  ngx_alloc(sizeof(struct pollfd) * ecf->connections, log),
                   NGX_ERROR);
 
     ngx_test_null(event_index,
-                  ngx_alloc(sizeof(ngx_event_t *) * max_connections, log),
+                  ngx_alloc(sizeof(ngx_event_t *) * ecf->connections, log),
                   NGX_ERROR);
 
     ngx_test_null(ready_index,
-                  ngx_alloc(sizeof(ngx_event_t *) * 2 * max_connections, log),
+                  ngx_alloc(sizeof(ngx_event_t *) * 2 * ecf->connections, log),
                   NGX_ERROR);
 
     nevents = 0;
 
-    timer_queue = ngx_event_init_timer(log);
-    if (timer_queue == NULL) {
+    if (ngx_event_timer_init(log) == NGX_ERROR) {
         return NGX_ERROR;
     }
 
-    ngx_event_actions.add = ngx_poll_add_event;
-    ngx_event_actions.del = ngx_poll_del_event;
-    ngx_event_actions.timer = ngx_event_add_timer;
-    ngx_event_actions.process = ngx_poll_process_events;
+    ngx_event_actions = ngx_poll_module_ctx.actions;
+
+    ngx_event_flags = NGX_HAVE_LEVEL_EVENT
+                      |NGX_HAVE_ONESHOT_EVENT
+                      |NGX_USE_LEVEL_EVENT;
 
     return NGX_OK;
 }
 
-int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags)
+
+static void ngx_poll_done(ngx_log_t *log)
+{
+    ngx_event_timer_done(log);
+
+    ngx_free(event_list);
+    ngx_free(event_index);
+    ngx_free(ready_index);
+}
+
+
+static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags)
 {
     ngx_event_t       *e;
     ngx_connection_t  *c;
 
-    c = (ngx_connection_t *) ev->data;
+    c = ev->data;
 
     ev->active = 1;
-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
+    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
 
     if (event == NGX_READ_EVENT) {
         e = c->write;
@@ -93,7 +144,8 @@
     return NGX_OK;
 }
 
-int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags)
+
+static int ngx_poll_del_event(ngx_event_t *ev, int event, u_int flags)
 {
     ngx_event_t       *e;
     ngx_connection_t  *c;
@@ -138,7 +190,8 @@
     return NGX_OK;
 }
 
-int ngx_poll_process_events(ngx_log_t *log)
+
+static int ngx_poll_process_events(ngx_log_t *log)
 {
     int                ready, found;
     u_int              i, nready;
@@ -202,33 +255,38 @@
 
         found = 0;
 
-        if (event_list[i].revents & POLLIN) {
+        if (event_list[i].revents & POLLNVAL) {
+            ngx_log_error(NGX_LOG_ALERT, log, EBADF,
+                          "poll() error on %d", event_list[i].fd);
+            continue;
+        }
+
+        if (event_list[i].revents & POLLIN
+            || (event_list[i].revents & (POLLERR|POLLHUP)
+                && c->read->active))
+        {
             found = 1;
             ready_index[nready++] = c->read;
         }
 
-        if (event_list[i].revents & POLLOUT) {
+        if (event_list[i].revents & POLLOUT
+            || (event_list[i].revents & (POLLERR|POLLHUP)
+                && c->write->active))
+        {
             found = 1;
             ready_index[nready++] = c->write;
         }
 
-        if (event_list[i].revents & (POLLERR|POLLHUP|POLLNVAL)) {
-            found = 1;
-
-            /* need ot add to ready_index[nready++] = c->read or c->write; */
-
-            err = 0;
-            if (event_list[i].revents & POLLNVAL) {
-                err = EBADF;
-            }
-
-            ngx_log_error(NGX_LOG_ERR, log, err,
-                          "poll() error on %d:%d",
-                          event_list[i].fd, event_list[i].revents);
-        }
-
         if (found) {
             ready--;
+            continue;
+        }
+
+        if (event_list[i].revents & (POLLERR|POLLHUP)) {
+            ngx_log_error(NGX_LOG_ALERT, log, 0,
+                          "strange poll() error on %d:%d:%d",
+                          event_list[i].fd,
+                          event_list[i].events, event_list[i].revents);
         }
     }
 
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index bb3c89d..b1f2c9d 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -109,6 +109,8 @@
 
 static void ngx_select_done(ngx_log_t *log)
 {
+    ngx_event_timer_done(log);
+
     ngx_free(event_index);
     ngx_free(ready_index);
 }
@@ -149,19 +151,21 @@
         max_write++;
     }
 #else
-    if (event == NGX_READ_EVENT)
+    if (event == NGX_READ_EVENT) {
         FD_SET(c->fd, &master_read_fd_set);
 
-    else if (event == NGX_WRITE_EVENT)
+    } else if (event == NGX_WRITE_EVENT) {
         FD_SET(c->fd, &master_write_fd_set);
+    }
 
-    if (max_fd != -1 && max_fd < c->fd)
+    if (max_fd != -1 && max_fd < c->fd) {
         max_fd = c->fd;
+    }
 
 #endif
 
     ev->active = 1;
-    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1: 0;
+    ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
 
     event_index[nevents] = ev;
     ev->index = nevents;
@@ -177,14 +181,16 @@
 
     c = ev->data;
 
-    if (ev->index == NGX_INVALID_INDEX)
+    if (ev->index == NGX_INVALID_INDEX) {
         return NGX_OK;
+    }
 
 #if (NGX_DEBUG_EVENT)
     ngx_log_debug(c->log, "del event: %d, %d" _ c->fd _ event);
 #endif
 
 #if (WIN32)
+
     if (event == NGX_READ_EVENT) {
         FD_CLR(c->fd, &master_read_fd_set);
         max_read--;
@@ -193,15 +199,20 @@
         FD_CLR(c->fd, &master_write_fd_set);
         max_write--;
     }
+
 #else
-    if (event == NGX_READ_EVENT)
+
+    if (event == NGX_READ_EVENT) {
         FD_CLR(c->fd, &master_read_fd_set);
 
-    else if (event == NGX_WRITE_EVENT)
+    } else if (event == NGX_WRITE_EVENT) {
         FD_CLR(c->fd, &master_write_fd_set);
+    }
 
-    if (max_fd == c->fd)
+    if (max_fd == c->fd) {
         max_fd = -1;
+    }
+
 #endif
 
     if (ev->index < --nevents) {
@@ -246,8 +257,9 @@
     if (max_fd == -1) {
         for (i = 0; i < nevents; i++) {
             c = (ngx_connection_t *) event_index[i]->data;
-            if (max_fd < c->fd)
+            if (max_fd < c->fd) {
                 max_fd = c->fd;
+            }
         }
 
 #if (NGX_DEBUG_EVENT)
@@ -344,10 +356,11 @@
                 ev->timer_set = 0;
             }
 
-            if (ev->write)
+            if (ev->write) {
                 ngx_select_del_event(ev, NGX_WRITE_EVENT, 0);
-            else
+            } else {
                 ngx_select_del_event(ev, NGX_READ_EVENT, 0);
+            }
         }
 
         ev->event_handler(ev);
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index ed22db5..dc46c6f 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -1,31 +1,25 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_types.h>
-#include <ngx_string.h>
-#include <ngx_log.h>
-#include <ngx_alloc.h>
-#include <ngx_array.h>
 #include <ngx_listen.h>
 #include <ngx_connection.h>
 #include <ngx_event.h>
-#include <ngx_conf_file.h>
+
+
+#define DEF_CONNECTIONS  1024
+
 
 extern ngx_event_module_t ngx_select_module_ctx;
 
-#if (HAVE_POLL)
-#include <ngx_poll_module.h>
-#endif
-
-#if (HAVE_DEVPOLL)
-#include <ngx_devpoll_module.h>
-#endif
-
 #if (HAVE_KQUEUE)
 extern ngx_event_module_t ngx_kqueue_module_ctx;
 #include <ngx_kqueue_module.h>
 #endif
 
+#if (HAVE_DEVPOLL)
+extern ngx_event_module_t ngx_devpoll_module_ctx;
+#endif
+
 #if (HAVE_AIO)
 #include <ngx_aio_module.h>
 #endif
@@ -259,7 +253,6 @@
     char                  *rv;
     void               ***ctx;
     ngx_conf_t            pcf;
-    ngx_event_conf_t     *ecf;
     ngx_event_module_t   *module;
 
     /* count the number of the event modules and set up their indices */
@@ -364,6 +357,7 @@
                   NGX_CONF_ERROR);
 
     ecf->connections = NGX_CONF_UNSET;
+    ecf->timer_queues = NGX_CONF_UNSET;
     ecf->type = NGX_CONF_UNSET;
 
     return ecf;
@@ -376,13 +370,27 @@
 
 #if (HAVE_KQUEUE)
 
-    ngx_conf_init_value(ecf->connections, 1024);
+#if 0
+    if (ecf->connections != NGX_CONF_UNSET) {
+        ecf->connections = (ngx_max_connections < DEF_CONNECTIONS) ?
+                                        ngx_max_connections : DEF_CONNECTIONS;
+
+    } else if (ecf->connections > ngx_max_connections) {
+    }
+#endif
+
+    ngx_conf_init_value(ecf->connections, DEF_CONNECTIONS);
     ngx_conf_init_value(ecf->type, ngx_kqueue_module_ctx.index);
 
+#elif (HAVE_DEVPOLL)
+
+    ngx_conf_init_value(ecf->connections, DEF_CONNECTIONS);
+    ngx_conf_init_value(ecf->type, ngx_devpoll_module_ctx.index);
+
 #else /* HAVE_SELECT */
 
     ngx_conf_init_value(ecf->connections,
-                        FD_SETSIZE < 1024 ? FD_SETSIZE : 1024);
+                  FD_SETSIZE < DEF_CONNECTIONS ? FD_SETSIZE : DEF_CONNECTIONS);
 
     ngx_conf_init_value(ecf->type, ngx_select_module_ctx.index);
 
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 3b189d6..4325ab3 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -3,6 +3,9 @@
 
 
 #include <ngx_config.h>
+#include <ngx_core.h>
+
+#if 0
 #include <ngx_types.h>
 #include <ngx_time.h>
 #include <ngx_socket.h>
@@ -10,6 +13,7 @@
 #include <ngx_alloc.h>
 #include <ngx_array.h>
 #include <ngx_conf_file.h>
+#endif
 
 
 
@@ -19,7 +23,9 @@
 #define NGX_INVALID_INDEX  0x80000000
 
 
+#if 0
 typedef struct ngx_event_s       ngx_event_t;
+#endif
 
 #if (HAVE_IOCP)
 typedef struct {
@@ -125,6 +131,7 @@
 };
 
 
+#if 1
 typedef enum {
     NGX_SELECT_EVENT_N = 0,
 #if (HAVE_POLL)
@@ -144,7 +151,7 @@
 #endif
     NGX_DUMMY_EVENT_N    /* avoid comma at end of enumerator list */
 } ngx_event_type_e ;
-
+#endif
 
 
 typedef struct {
@@ -165,18 +172,18 @@
 
 /* The event filter requires to read/write the whole data -
    select, poll, /dev/poll, kqueue. */
-#define NGX_HAVE_LEVEL_EVENT    1
+#define NGX_HAVE_LEVEL_EVENT    0x00000001
 
 /* The event filter is deleted after a notification without an additional
    syscall - select, poll, kqueue.  */
-#define NGX_HAVE_ONESHOT_EVENT  2
+#define NGX_HAVE_ONESHOT_EVENT  0x00000002
 
 /* The event filter notifies only the changes and an initial level - kqueue */
-#define NGX_HAVE_CLEAR_EVENT    4
+#define NGX_HAVE_CLEAR_EVENT    0x00000004
 
 /* The event filter has kqueue features - the eof flag, errno,
    available data, etc */
-#define NGX_HAVE_KQUEUE_EVENT   8
+#define NGX_HAVE_KQUEUE_EVENT   0x00000008
 
 /* The event filter supports low water mark - kqueue's NOTE_LOWAT.
    kqueue in FreeBSD 4.1-4.2 has no NOTE_LOWAT so we need a separate flag */
@@ -207,6 +214,7 @@
    kqueue:     kqueue deletes event filters for file that closed
                so we need only to delete filters in user-level batch array
    /dev/poll:  we need to flush POLLREMOVE event before closing file */
+
 #define NGX_CLOSE_EVENT         1
 
 
@@ -215,9 +223,6 @@
 #define NGX_READ_EVENT     EVFILT_READ
 #define NGX_WRITE_EVENT    EVFILT_WRITE
 
-#define NGX_ENABLE_EVENT   EV_ENABLE
-#define NGX_DISABLE_EVENT  EV_DISABLE
-
 /* NGX_CLOSE_EVENT is the module flag and it would not go into a kernel
    so we need to choose the value that would not interfere with any existent
    and future flags. kqueue has such values - EV_FLAG1, EV_EOF and EV_ERROR.
@@ -252,6 +257,10 @@
 
 #endif /* HAVE_KQUEUE */
 
+#ifndef NGX_CLEAR_EVENT
+#define NGX_CLEAR_EVENT    0    /* dummy */
+#endif
+
 #if (USE_KQUEUE)
 
 #define ngx_init_events      ngx_kqueue_init
@@ -317,8 +326,8 @@
 
 typedef struct {
     int   connections;
-    int   type;
     int   timer_queues;
+    int   type;
 } ngx_event_conf_t;
 
 
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 720b3a5..75dda55 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -32,6 +32,11 @@
 #endif
 
     do {
+
+        /* Create the pool before accept() to avoid copy the sockaddr.
+           Although accept() can fail it's uncommon case
+           and the pool can be got from the free pool list */
+
         pool = ngx_create_pool(ls->pool_size, ev->log);
         if (pool == NULL) {
             return;
diff --git a/src/event/ngx_event_acceptex.c b/src/event/ngx_event_acceptex.c
index 07d9993..ce46a16 100644
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -104,14 +104,10 @@
 
         c->unexpected_eof = 1;
         wev->write = 1;
-        rev->first = wev->first = 1;
 
         c->handler = ls->handler;
         rev->event_handler = ngx_event_acceptex;
 
-        wev->timer_handler = rev->timer_handler = ngx_event_close_connection;
-        wev->close_handler = rev->close_handler = ngx_event_close_connection;
-
         c->ctx = ls->ctx;
         c->servers = ls->servers;