nginx-0.0.7-2004-07-05-19:08:23 import
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 865b343..8039c3d 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -157,7 +157,6 @@
 #if (HAVE_LOWAT_EVENT)
                      |NGX_HAVE_LOWAT_EVENT
 #endif
-                     |NGX_HAVE_INSTANCE_EVENT
                      |NGX_HAVE_KQUEUE_EVENT;
 
     return NGX_OK;
@@ -370,7 +369,7 @@
     for ( ;; ) {
         timer = ngx_event_find_timer();
 
-#if (NGX_THREADS0)
+#if (NGX_THREADS)
         if (timer == NGX_TIMER_ERROR) {
             return NGX_ERROR;
         }
@@ -522,13 +521,11 @@
                 ngx_kqueue_dump_event(ev->log, &event_list[i]);
             }
 
-            ev->returned_instance = instance;
-
 #if (NGX_THREADS)
 
             if (ngx_threaded && !ev->accept) {
                 ev->posted_ready = 1;
-                ev->posted_available += event_list[i].data;
+                ev->posted_available = event_list[i].data;
 
                 if (event_list[i].flags & EV_EOF) {
                     ev->posted_eof = 1;
diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c
index bf748f1..2690617 100644
--- a/src/event/ngx_event.c
+++ b/src/event/ngx_event.c
@@ -279,6 +279,9 @@
     rev = cycle->read_events;
     for (i = 0; i < cycle->connection_n; i++) {
         rev[i].closed = 1;
+#if (NGX_THREADS)
+        rev[i].lock = &c[i].lock;
+#endif
     }
 
     cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * ecf->connections,
@@ -290,6 +293,9 @@
     wev = cycle->write_events;
     for (i = 0; i < cycle->connection_n; i++) {
         wev[i].closed = 1;
+#if (NGX_THREADS)
+        wev[i].lock = &c[i].lock;
+#endif
     }
 
     /* for each listening socket */
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 1565437..05e1fb2 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -73,8 +73,6 @@
 
     unsigned         deferred_accept:1;
 
-    unsigned         overflow:1;
-
     /* the pending eof reported by kqueue or in aio chain operation */
     unsigned         pending_eof:1;
 
diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c
index 6401b6a..7de064f 100644
--- a/src/event/ngx_event_accept.c
+++ b/src/event/ngx_event_accept.c
@@ -210,12 +210,17 @@
         rinstance = rev->returned_instance;
         winstance = wev->returned_instance;
 
+#if (NGX_THREADS)
+        if (*(rev->lock)) {
+            ngx_spinlock(rev->lock, 1000);
+            ngx_unlock(rev->lock);
+        }
+#endif
+
         ngx_memzero(rev, sizeof(ngx_event_t));
         ngx_memzero(wev, sizeof(ngx_event_t));
         ngx_memzero(c, sizeof(ngx_connection_t));
 
-        /* ngx_memzero(c) does ngx_unlock(&c->lock); */
-
         c->pool = pool;
 
         c->listening = ls->listening;
diff --git a/src/event/ngx_event_connect.c b/src/event/ngx_event_connect.c
index db56f10..4eecd88 100644
--- a/src/event/ngx_event_connect.c
+++ b/src/event/ngx_event_connect.c
@@ -228,6 +228,11 @@
 
     c->number = ngx_atomic_inc(ngx_connection_counter);
 
+#if (NGX_THREADS)
+    rev->lock = pc->lock;
+    wev->lock = pc->lock;
+#endif
+
     if (ngx_add_conn) {
         if (ngx_add_conn(c) == NGX_ERROR) {
             return NGX_ERROR;
diff --git a/src/event/ngx_event_connect.h b/src/event/ngx_event_connect.h
index 1534c14..01299f1 100644
--- a/src/event/ngx_event_connect.h
+++ b/src/event/ngx_event_connect.h
@@ -41,6 +41,9 @@
     int                tries;
 
     ngx_connection_t  *connection;
+#if (NGX_THREADS)
+    ngx_atomic_t      *lock;
+#endif
 
     int                rcvbuf;
 
diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c
index 71853ed..41be040 100644
--- a/src/event/ngx_event_posted.c
+++ b/src/event/ngx_event_posted.c
@@ -28,27 +28,6 @@
 
         ngx_delete_posted_event(ev);
 
-#if 0
-        /* do not check instance ??? */
-
-        if (ev->accept) {
-            continue;
-        }
-#endif
-
-        if (ev->closed
-            || (ev->use_instance && ev->instance != ev->returned_instance))
-        {
-            /*
-             * the stale event from a file descriptor
-             * that was just closed in this iteration
-             */
-
-            ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                           "stale posted event " PTR_FMT, ev);
-            continue;
-        }
-
         ev->event_handler(ev);
     }
 }
@@ -58,7 +37,30 @@
 
 void ngx_wakeup_worker_thread(ngx_cycle_t *cycle)
 {
-    ngx_int_t  i;
+    ngx_int_t     i;
+    ngx_uint_t    busy;
+    ngx_event_t  *ev;
+
+#if 0
+    busy = 1;
+
+    if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) {
+        return;
+    }
+
+    for (ev = (ngx_event_t *) ngx_posted_events; ev; ev = ev->next) {
+        if (*(ev->lock) == 0) {
+            busy = 0;
+            break;
+        }
+    }
+
+    ngx_mutex_unlock(ngx_posted_events_mutex);
+
+    if (busy) {
+        return;
+    }
+#endif
 
     for (i = 0; i < ngx_threads_n; i++) {
         if (ngx_threads[i].state == NGX_THREAD_FREE) {
@@ -97,46 +99,25 @@
 
             ngx_delete_posted_event(ev);
 
-            ngx_log_debug3(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
-                          "event instance: c:%d i:%d r:%d",
-                          ev->closed, ev->instance, ev->returned_instance);
-
-            if (ev->closed
-                || (ev->use_instance && ev->instance != ev->returned_instance))
-            {
-                /*
-                 * The stale event from a file descriptor that was just
-                 * closed in this iteration.  We use ngx_cycle->log
-                 * because ev->log may be already destoyed.
-                 */
-
-                ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
-                               "stale posted event " PTR_FMT, ev);
-
-                ngx_unlock(ev->lock);
-
-                ev = ev->next;
-
-                continue;
-            }
-
             ev->locked = 1;
 
             ev->ready |= ev->posted_ready;
             ev->timedout |= ev->posted_timedout;
-            ev->available |= ev->posted_available;
             ev->pending_eof |= ev->posted_eof;
 #if (HAVE_KQUEUE)
             ev->kq_errno |= ev->posted_errno;
 #endif
+            if (ev->posted_available) {
+                ev->available = ev->posted_available;
+            }
 
             ev->posted_ready = 0;
             ev->posted_timedout = 0;
-            ev->posted_available = 0;
             ev->posted_eof = 0;
 #if (HAVE_KQUEUE)
             ev->posted_errno = 0;
 #endif
+            ev->posted_available = 0;
 
             ngx_mutex_unlock(ngx_posted_events_mutex);
 
diff --git a/src/event/ngx_event_posted.h b/src/event/ngx_event_posted.h
index cb916db..5a30393 100644
--- a/src/event/ngx_event_posted.h
+++ b/src/event/ngx_event_posted.h
@@ -12,8 +12,14 @@
                 ev->next = (ngx_event_t *) ngx_posted_events;                 \
                 ev->prev = (ngx_event_t **) &ngx_posted_events;               \
                 ngx_posted_events = ev;                                       \
-                ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,         \
+                if (ev->next) {                                               \
+                    ev->next->prev = &ev->next;                               \
+                }                                                             \
+                ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,                \
                                "post event " PTR_FMT, ev);                    \
+            } else  {                                                         \
+                ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,                \
+                               "update posted event " PTR_FMT, ev);           \
             }
 
 #define ngx_delete_posted_event(ev)                                           \
@@ -21,7 +27,9 @@
         if (ev->next) {                                                       \
             ev->next->prev = ev->prev;                                        \
         }                                                                     \
-        ev->prev = NULL;
+        ev->prev = NULL;                                                      \
+        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0,                        \
+                       "delete posted event " PTR_FMT, ev);