nginx-0.0.2-2004-02-03-00:19:52 import
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index e169c8c..28966fe 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -375,6 +375,8 @@
     ngx_gettimeofday(&tv);
     ngx_time_update(tv.tv_sec);
 
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "kevent events: %d", events);
+
     delta = ngx_elapsed_msec;
     ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
 
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index 37c10e3..8727c21 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -320,12 +320,12 @@
 
         found = 0;
 
-        if (event_list[i].revents & (POLLIN|POLLERR|POLLHUP)) {
+        if (event_list[i].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) {
             found = 1;
             ready_index[nready++] = c->read;
         }
 
-        if (event_list[i].revents & (POLLOUT|POLLERR|POLLHUP)) {
+        if (event_list[i].revents & (POLLOUT|POLLERR|POLLHUP|POLLNVAL)) {
             found = 1;
             ready_index[nready++] = c->write;
         }
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 18d1bde..602960b 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -315,14 +315,15 @@
         deltas += delta;
         if (deltas > 1000) {
             ngx_gettimeofday(&tv);
-            deltas = tv.tv_usec / 1000;
             ngx_time_update(tv.tv_sec);
+            deltas = tv.tv_usec / 1000;
         }
 
         ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
                        "select timer: %d, delta: %d", timer, (int) delta);
 
     } else {
+        delta = 0;
         ngx_gettimeofday(&tv);
         ngx_time_update(tv.tv_sec);
 
@@ -438,8 +439,10 @@
     /* disable warning: 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);
+        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,
+                      "the maximum number of files "
+                      "supported by select() is " ngx_value(FD_SETSIZE));
+        return NGX_CONF_ERROR;
     }
 
     return NGX_CONF_OK;
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index bf66346..482310b 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -84,6 +84,13 @@
       0,
       NULL },
 
+    { ngx_string("multi_accept"),
+      NGX_EVENT_CONF|NGX_CONF_TAKE1,
+      ngx_conf_set_flag_slot,
+      0,
+      offsetof(ngx_event_conf_t, multi_accept),
+      NULL },
+
       ngx_null_command
 };
 
@@ -421,8 +428,8 @@
                   NGX_CONF_ERROR);
 
     ecf->connections = NGX_CONF_UNSET;
-    ecf->timer_queues = NGX_CONF_UNSET;
     ecf->use = NGX_CONF_UNSET;
+    ecf->multi_accept = NGX_CONF_UNSET;
     ecf->name = (void *) NGX_CONF_UNSET;
 
     return ecf;
@@ -457,7 +464,7 @@
 
     cycle->connection_n = ecf->connections;
 
-    ngx_conf_init_value(ecf->timer_queues, 10);
+    ngx_conf_init_value(ecf->multi_accept, 1);
 
     return NGX_CONF_OK;
 }
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 0e79392..68d9f81 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -345,10 +345,10 @@
 
 
 typedef struct {
-    int    connections;
-    int    timer_queues;
-    int    use;
-    char  *name;
+    int          connections;
+    int          use;
+    ngx_flag_t   multi_accept;
+    char       *name;
 } ngx_event_conf_t;
 
 
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index be282eb..8ecd29b 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -23,6 +23,13 @@
 
     ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);
 
+    if (ngx_event_flags & (NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT)) {
+        ev->available = 1;
+
+    } else if (!(ngx_event_flags & NGX_HAVE_KQUEUE_EVENT)) {
+        ev->available = ecf->multi_accept;
+    }
+
     ls = ev->data;
 
     ngx_log_debug(ev->log, "accept on %s ready: %d" _
@@ -31,26 +38,33 @@
 
     ev->ready = 0;
     accepted = 0;
+    pool = NULL;
 
     do {
 
-        /*
-         * Create the pool before accept() to avoid copy the sockaddr.
-         * Although accept() can fail it's an uncommon case
-         * and besides the pool can be got from the free pool list
-         */
+        if (pool == NULL) {
 
-        if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) {
-            return;
+            /*
+             * Create the pool before accept() to avoid copy the sockaddr.
+             * Although accept() can fail it's an uncommon case
+             * and besides the pool can be got from the free pool list
+             */
+
+            if (!(pool = ngx_create_pool(ls->listening->pool_size, ev->log))) {
+                return;
+            }
         }
 
         if (!(sa = ngx_palloc(pool, ls->listening->socklen))) {
+            ngx_destroy_pool(pool);
             return;
         }
 
         if (!(log = ngx_palloc(pool, sizeof(ngx_log_t)))) {
+            ngx_destroy_pool(pool);
             return;
         }
+
         ngx_memcpy(log, ls->log, sizeof(ngx_log_t));
         pool->log = log;
 
@@ -67,6 +81,8 @@
                 ngx_log_error(NGX_LOG_NOTICE, log, err,
                               "EAGAIN after %d accepted connection(s)",
                               accepted);
+
+                ngx_destroy_pool(pool);
                 return;
             }
 
@@ -74,6 +90,17 @@
                           "accept() on %s failed",
                           ls->listening->addr_text.data);
 
+            if (err == NGX_ECONNABORTED) {
+                if (ngx_event_flags & NGX_HAVE_KQUEUE_EVENT) {
+                    ev->available--;
+                }
+
+                if (ev->available) {
+                    /* reuse the previously allocated pool */
+                    continue;
+                }
+            }
+
             ngx_destroy_pool(pool);
             return;
         }
@@ -187,8 +214,10 @@
         wev->write = 1;
         wev->ready = 1;
 
-        if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT)) {
-            /* aio, iocp, epoll */
+        if (ngx_event_flags
+            & (NGX_USE_AIO_EVENT|NGX_USE_EDGE_EVENT|NGX_USE_SIGIO_EVENT))
+        {
+            /* aio, iocp, sigio, epoll */
             rev->ready = 1;
         }
 
@@ -229,6 +258,8 @@
             }
         }
 
+        pool = NULL;
+
         log->data = NULL;
         log->handler = NULL;