nginx-0.0.1-2002-08-15-21:20:26 import
diff --git a/src/event/modules/ngx_overlapped_module.c b/src/event/modules/ngx_overlapped_module.c
index 2bb4d7f..c3af39d 100644
--- a/src/event/modules/ngx_overlapped_module.c
+++ b/src/event/modules/ngx_overlapped_module.c
@@ -1,17 +1,41 @@
 
+
+    event = WSACreateEvent(void);
+    WSAEventSelect(s, event, FD_ACCEPT);
+
+
 int ngx_overlapped_process_events(ngx_log_t *log)
 {
     if (acceptex)
-        event = SleepEx(timer, 1);
+        n = SleepEx(timer, 1);
     else
-        event = WSAWaitForMultipleEvents(n_events, events, 0, timer, 1);
+        n = WSAWaitForMultipleEvents(nevents, events, 0, timer, 1);
 
-    if (event == WSA_IO_COMPLETION)
-        look ready array
+    if (n == WSA_WAIT_TIMEOUT)
+        close some event;
+
+    if (n == WSA_IO_COMPLETION)
+        again
+
+    /* try it with AcceptEx() on NT to detect connected sockets */
+    if (!acceptex) {
+        WSAEnumNetworkEvents(
+            sockets[n - WSA_WAIT_EVENT_0],
+            events[n - WSA_WAIT_EVENT_0],
+            net_events);
+
+        if (net_events.lNetworkEvents & FD_ACCEPT) {
+            if (net_events.iErrorCode[FD_ACCEPT_BIT] != 0)
+                accept error
+                again
+
+            ngx_event_accept(); OR post AcceptEx();
+        }
+    }
 }
 
 void CALLBACK overlapped_completion_procedure(DWORD error, DWORD nbytes,
                          LPWSAOVERLAPPED overlapped, DWORD flags)
 {
-    push overlapped;
+    run event handler
 }
diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h
index 7087e69..9f758d3 100644
--- a/src/event/ngx_event.h
+++ b/src/event/ngx_event.h
@@ -16,8 +16,8 @@
     void            *context;
     char            *action;
 
-    ngx_event_t     *prev;     /* queue in select(), poll() */
-    ngx_event_t     *next;
+    ngx_event_t     *prev;     /* queue in select(), poll(), mutex(),        */
+    ngx_event_t     *next;     /*   aio_read(), aio_write()                  */
 
     int            (*timer_handler)(ngx_event_t *ev);
     ngx_event_t     *timer_prev;
@@ -52,7 +52,7 @@
 #endif
 #if (HAVE_KQUEUE)
     unsigned         eof:1;
-    int              errno;
+    int              error;
 #endif
 };
 
@@ -70,12 +70,20 @@
     int  (*add)(ngx_event_t *ev, int event, u_int flags);
     int  (*del)(ngx_event_t *ev, int event);
     int  (*process)(ngx_log_t *log);
-/*
     int  (*read)(ngx_event_t *ev, char *buf, size_t size);
+/*
     int  (*write)(ngx_event_t *ev, char *buf, size_t size);
 */
 } ngx_event_actions_t;
 
+/*
+
+NGX_LEVEL_EVENT (default)  select, poll, kqueue
+                                requires to read whole data
+NGX_ONESHOT_EVENT          kqueue
+NGX_CLEAR_EVENT            kqueue
+
+*/
 
 #if (HAVE_KQUEUE)
 
@@ -99,15 +107,21 @@
 
 
 #if (USE_KQUEUE)
+
 #define ngx_init_events      ngx_kqueue_init
 #define ngx_process_events   ngx_kqueue_process_events
 #define ngx_add_event        ngx_kqueue_add_event
 #define ngx_del_event        ngx_kqueue_del_event
+#define ngx_event_recv       ngx_event_recv_core
+
 #else
+
 #define ngx_init_events     (ngx_event_init[ngx_event_type])
 #define ngx_process_events   ngx_event_actions.process
 #define ngx_add_event        ngx_event_actions.add
 #define ngx_del_event        ngx_event_actions.del
+#define ngx_event_recv       ngx_event_recv_core
+
 #endif
 
 
diff --git a/src/event/ngx_event_mutex.c b/src/event/ngx_event_mutex.c
new file mode 100644
index 0000000..5a9542b
--- /dev/null
+++ b/src/event/ngx_event_mutex.c
@@ -0,0 +1,14 @@
+
+spinlock_max depend on CPU number and mutex type.
+    1 CPU               1
+    ngx_malloc_mutex    1000 ?
+
+
+int ngx_event_mutex_trylock(ngx_mutex_t *mtx)
+{
+    for(i = mtx->spinlock_max; i; i--)
+        if (trylock(mtx->lock))
+            return 1;
+
+    return 0;
+}
diff --git a/src/event/ngx_event_read.c b/src/event/ngx_event_recv.c
similarity index 65%
rename from src/event/ngx_event_read.c
rename to src/event/ngx_event_recv.c
index b08e510..75afcb8 100644
--- a/src/event/ngx_event_read.c
+++ b/src/event/ngx_event_recv.c
@@ -2,23 +2,28 @@
 #include <ngx_config.h>
 #include <ngx_errno.h>
 #include <ngx_log.h>
+#include <ngx_recv.h>
 #include <ngx_connection.h>
 
-int ngx_event_recv(ngx_connection_t *c, char *buf, size_t size)
+int ngx_event_recv_core(ngx_event_t *ev, char *buf, size_t size)
 {
-    int           n;
-    ngx_err_t     err;
-    ngx_event_t  *ev = c->read;
+    int                n;
+    ngx_err_t          err;
+    ngx_connection_t  *c;
+
+    c = (ngx_connection_t *) ev->data;
 
 #if (HAVE_KQUEUE)
+    ngx_log_debug(ev->log, "ngx_event_recv: eof:%d, avail:%d, err:%d" _
+                  ev->eof _ ev->available _ ev->error);
 #if !(USE_KQUEUE)
     if (ngx_event_type == NGX_KQUEUE_EVENT)
 #endif
         if (ev->eof && ev->available == 0) {
             if (ev->error) {
                 ngx_log_error(NGX_LOG_ERR, ev->log, ev->error,
-                             "ngx_event_recv: recv failed while %s",
-                             ev->log->action);
+                              "ngx_event_recv: recv failed while %s",
+                              ev->log->action);
 
                 return -1;
             }
@@ -27,7 +32,7 @@
         }
 #endif
 
-    n = recv(c->fd, buf, size, 0);
+    n = ngx_recv(c->fd, buf, size, 0);
 
     if (n == -1) {
         err = ngx_socket_errno;
diff --git a/src/event/ngx_event_write.c b/src/event/ngx_event_write.c
index 0a9a482..965a87c 100644
--- a/src/event/ngx_event_write.c
+++ b/src/event/ngx_event_write.c
@@ -10,8 +10,8 @@
 #include <ngx_event_write.h>
 
 
-ngx_chain_t *ngx_event_writer(ngx_connection_t *cn, ngx_chain_t *in,
-                              off_t flush)
+ngx_chain_t *ngx_event_write(ngx_connection_t *cn, ngx_chain_t *in,
+                             off_t flush)
 {
     int           rc;
     char         *last;
@@ -34,25 +34,21 @@
         header->nelts = 0;
         trailer->nelts = 0;
 
-        if (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) {
+        if (ch->hunk->type & NGX_HUNK_IN_MEMORY) {
             last = NULL;
             iov = NULL;
 
-            while (ch
-                   && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)))
+            while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY))
             {
-                if (ch->hunk->type & NGX_HUNK_FLUSH)
-                    continue;
-
-                if (last == ch->hunk->pos.p) {
-                    iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p;
+                if (last == ch->hunk->pos.mem) {
+                    iov->ngx_iov_len += ch->hunk->last.mem - ch->hunk->pos.mem;
 
                 } else {
                     ngx_test_null(iov, ngx_push_array(header),
                                   (ngx_chain_t *) -1);
-                    iov->ngx_iov_base = ch->hunk->pos.p;
-                    iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p;
-                    last = ch->hunk->last.p;
+                    iov->ngx_iov_base = ch->hunk->pos.mem;
+                    iov->ngx_iov_len = ch->hunk->last.mem - ch->hunk->pos.mem;
+                    last = ch->hunk->last.mem;
                 }
 
                 ch = ch->next;
@@ -70,25 +66,23 @@
                            &sent);
         } else {
 #endif
-            if (ch && ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)) {
+            if (ch && ch->hunk->type & NGX_HUNK_IN_MEMORY) {
                 last = NULL;
                 iov = NULL;
 
-                while (ch
-                   && (ch->hunk->type & (NGX_HUNK_IN_MEMORY | NGX_HUNK_FLUSH)))
-                {
-                    if (ch->hunk->type & NGX_HUNK_FLUSH)
-                        continue;
+                while (ch && (ch->hunk->type & NGX_HUNK_IN_MEMORY)) {
 
-                    if (last == ch->hunk->pos.p) {
-                        iov->ngx_iov_len += ch->hunk->last.p - ch->hunk->pos.p;
+                    if (last == ch->hunk->pos.mem) {
+                        iov->ngx_iov_len +=
+                                        ch->hunk->last.mem - ch->hunk->pos.mem;
 
                     } else {
                         ngx_test_null(iov, ngx_push_array(trailer),
                                       (ngx_chain_t *) -1);
-                        iov->ngx_iov_base = ch->hunk->pos.p;
-                        iov->ngx_iov_len = ch->hunk->last.p - ch->hunk->pos.p;
-                        last = ch->hunk->last.p;
+                        iov->ngx_iov_base = ch->hunk->pos.mem;
+                        iov->ngx_iov_len =
+                                        ch->hunk->last.mem - ch->hunk->pos.mem;
+                        last = ch->hunk->last.mem;
                     }
 
                     ch = ch->next;
@@ -98,8 +92,8 @@
             if (file) {
                 rc = ngx_sendfile(cn->fd,
                                   (ngx_iovec_t *) header->elts, header->nelts,
-                                  file->fd, file->pos.f,
-                                          (size_t) (file->last.f - file->pos.f),
+                                  file->fd, file->pos.file,
+                                  (size_t) (file->last.file - file->pos.file),
                                   (ngx_iovec_t *) trailer->elts, trailer->nelts,
                                   &sent, cn->log);
             } else {
@@ -117,17 +111,18 @@
         flush -= sent;
 
         for (ch = in; ch && !(ch->hunk->type & NGX_HUNK_LAST); ch = ch->next) {
-            if (sent >= ch->hunk->last.f - ch->hunk->pos.f) {
-                sent -= ch->hunk->last.f - ch->hunk->pos.f;
-                ch->hunk->last.f = ch->hunk->pos.f;
+            if (sent >= ch->hunk->last.file - ch->hunk->pos.file) {
+                sent -= ch->hunk->last.file - ch->hunk->pos.file;
+                ch->hunk->last.file = ch->hunk->pos.file;
                     continue;
             }
 
-            ch->hunk->pos.f += sent;
+            ch->hunk->pos.file += sent;
             break;
         }
 
-    } while (flush > 0);
+    /* flush hunks if threaded state */
+    } while (cn->write->context && flush > 0);
 
     ngx_destroy_array(trailer);
     ngx_destroy_array(header);