changeset 278:0ba4821f4460

nginx-0.0.2-2004-03-04-10:04:55 import
author Igor Sysoev <igor@sysoev.ru>
date Thu, 04 Mar 2004 07:04:55 +0000
parents e91499541410
children b79f021a644a
files auto/make auto/os/conf auto/sources src/core/nginx.c src/core/ngx_atomic.h src/core/ngx_connection.c src/core/ngx_core.h src/core/ngx_cycle.c src/core/ngx_cycle.h src/core/ngx_log.c src/core/ngx_log.h src/event/modules/ngx_iocp_module.c src/event/modules/ngx_select_module.c src/event/ngx_event_acceptex.c src/http/modules/ngx_http_ssi_filter.c src/os/unix/ngx_aio_read.c src/os/unix/ngx_files.c src/os/unix/ngx_files.h src/os/unix/ngx_os.h src/os/unix/ngx_process.h src/os/unix/ngx_process_cycle.c src/os/unix/ngx_process_cycle.h src/os/unix/ngx_user.h src/os/win32/ngx_errno.h src/os/win32/ngx_files.h src/os/win32/ngx_os.h src/os/win32/ngx_process.c src/os/win32/ngx_process.h src/os/win32/ngx_process_cycle.c src/os/win32/ngx_process_cycle.h src/os/win32/ngx_thread.h src/os/win32/ngx_user.h src/os/win32/ngx_win32_config.h src/os/win32/ngx_wsarecv.c src/os/win32/ngx_wsarecv_chain.c src/os/win32/ngx_wsasend_chain.c
diffstat 36 files changed, 930 insertions(+), 131 deletions(-) [+]
line wrap: on
line diff
--- a/auto/make
+++ b/auto/make
@@ -36,21 +36,29 @@ echo                                    
 echo "CORE_DEPS = \\"                         >> $MAKEFILE
 for dep in $CORE_DEPS
 do
+    if [ $PLATFORM = win32 ]; then
+        dep=`echo $dep | sed -e "s/\//\\\\\\/g"`
+    fi
     echo "	$dep \\"                      >> $MAKEFILE
 done
 echo                                          >> $MAKEFILE
 
-echo "CORE_INCS = $CORE_INCS -I $OBJS"        >> $MAKEFILE
+inc=`echo "$CORE_INCS -I $OBJS" | sed -e "s/\//\\\\\\/g"`
+echo "CORE_INCS = $inc"                       >> $MAKEFILE
 echo                                          >> $MAKEFILE
 
 echo "HTTP_DEPS = \\"                         >> $MAKEFILE
 for inc in $HTTP_DEPS
 do
+    if [ $PLATFORM = win32 ]; then
+        inc=`echo $inc | sed -e "s/\//\\\\\\/g"`
+    fi
     echo "	$inc \\"                      >> $MAKEFILE
 done
 echo                                          >> $MAKEFILE
 
-echo "HTTP_INCS = $HTTP_INCS"                 >> $MAKEFILE
+inc=`echo "$HTTP_INCS" | sed -e "s/\//\\\\\\/g"`
+echo "HTTP_INCS = $inc"                       >> $MAKEFILE
 echo                                          >> $MAKEFILE
 
 
@@ -60,12 +68,21 @@ echo "nginx: \\"                        
 for src in $CORE_SRCS $HTTP_SRCS
 do
     obj=`echo $src | sed -e "s/\.c\$/.$OBJEXT/" -e "s/\.S\$/.$OBJEXT/"`
-    echo "	$OBJS/$obj \\"                >> $MAKEFILE
+    obj="$OBJS/$obj"
+    if [ $PLATFORM = win32 ]; then
+        obj=`echo $obj | sed -e "s/\//\\\\\\/g"`
+    fi
+
+    echo "	$obj \\"                      >> $MAKEFILE
 done
 
 for src in $NGX_MODULES_C $LINK_DEPS
 do
     obj=`echo $src | sed -e "s/\.c\$/.$OBJEXT/"`
+    if [ $PLATFORM = win32 ]; then
+        obj=`echo $obj | sed -e "s/\//\\\\\\/g"`
+    fi
+
     echo "	$obj \\"                      >> $MAKEFILE
 done
 
@@ -75,10 +92,18 @@ echo "	\$(CC) ${BINOUT}nginx \\"        
 for src in $CORE_SRCS $HTTP_SRCS
 do
     obj=`echo $src | sed -e "s/\.c\$/.$OBJEXT/" -e "s/\.S\$/.$OBJEXT/"`
-    echo "	$OBJS/$obj \\"                >> $MAKEFILE
+    obj="$OBJS/$obj"
+    if [ $PLATFORM = win32 ]; then
+        obj=`echo $obj | sed -e "s/\//\\\\\\/g"`
+    fi
+
+    echo "	$obj \\"                      >> $MAKEFILE
 done
 
 obj=`echo $NGX_MODULES_C | sed -e "s/\.c\$/.$OBJEXT/"`
+if [ $PLATFORM = win32 ]; then
+    obj=`echo $obj | sed -e "s/\//\\\\\\/g"`
+fi
 echo "	$obj \\"                              >> $MAKEFILE
 echo "	$CORE_LIBS \\"                        >> $MAKEFILE
 echo "	$CORE_LINK"                           >> $MAKEFILE
--- a/auto/os/conf
+++ b/auto/os/conf
@@ -32,8 +32,10 @@ case $PLATFORM in
         CORE_DEPS="$WIN32_DEPS"
         CORE_SRCS="$WIN32_SRCS $SELECT_SRCS $IOCP_SRCS"
         EVENT_MODULES="$EVENT_MODULES $SELECT_MODULE $IOCP_MODULE"
+        EVENT_FOUND=YES
 
-        CFLAGS="$CFLAGS -D HAVE_AIO=1 -D HAVE_IOCP=1"
+        have=HAVE_AIO . auto/have
+        have=HAVE_IOCP . auto/have
         CORE_LIBS="$CORE_LIBS ws2_32.lib"
 
         # msvcrt.dll
--- a/auto/sources
+++ b/auto/sources
@@ -103,20 +103,21 @@ UNIX_DEPS="$CORE_DEPS $EVENT_DEPS \
             src/os/unix/ngx_process.h \
             src/os/unix/ngx_thread.h \
             src/os/unix/ngx_socket.h \
-            src/os/unix/ngx_os.h"
+            src/os/unix/ngx_os.h \
+            src/os/unix/ngx_process_cycle.h"
 
 UNIX_SRCS="$CORE_SRCS $EVENT_SRCS \
             src/os/unix/ngx_time.c \
             src/os/unix/ngx_errno.c \
-            src/os/unix/ngx_sendv.c \
             src/os/unix/ngx_files.c \
             src/os/unix/ngx_socket.c \
             src/os/unix/ngx_recv.c \
             src/os/unix/ngx_readv_chain.c \
             src/os/unix/ngx_writev_chain.c \
-            src/os/unix/ngx_posix_init.c \
+            src/os/unix/ngx_daemon.c \
             src/os/unix/ngx_process.c \
-            src/os/unix/ngx_daemon.c"
+            src/os/unix/ngx_posix_init.c \
+            src/os/unix/ngx_process_cycle.c"
 
 FREEBSD_DEPS=src/os/unix/ngx_freebsd_config.h
 FREEBSD_SRCS=src/os/unix/ngx_freebsd_init.c
@@ -144,18 +145,20 @@ WIN32_DEPS="$CORE_DEPS $EVENT_DEPS \
             src/os/win32/ngx_files.h \
             src/os/win32/ngx_process.h \
             src/os/win32/ngx_socket.h \
-            src/os/win32/ngx_os.h"
+            src/os/win32/ngx_os.h \
+            src/os/win32/ngx_process_cycle.h"
 
 WIN32_SRCS="$CORE_SRCS $EVENT_SRCS \
             src/os/win32/ngx_errno.c \
             src/os/win32/ngx_files.c \
             src/os/win32/ngx_time.c \
+            src/os/win32/ngx_process.c \
             src/os/win32/ngx_socket.c \
             src/os/win32/ngx_wsarecv.c \
             src/os/win32/ngx_wsarecv_chain.c \
             src/os/win32/ngx_wsasend_chain.c \
-            src/os/win32/ngx_sendv.c \
             src/os/win32/ngx_win32_init.c \
+            src/os/win32/ngx_process_cycle.c \
             src/event/ngx_event_acceptex.c"
 
 
--- a/src/core/nginx.c
+++ b/src/core/nginx.c
@@ -5,6 +5,8 @@
 #include <nginx.h>
 
 
+#if 0
+
 typedef struct {
      ngx_flag_t  daemon;
      ngx_flag_t  master;
@@ -30,8 +32,10 @@ static void ngx_worker_process_cycle(ngx
 #if (NGX_THREADS)
 static int ngx_worker_thread_cycle(void *data);
 #endif
+
+#endif
+
 static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle, char **envp);
-static ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);
 static ngx_int_t ngx_getopt(ngx_master_ctx_t *ctx, ngx_cycle_t *cycle);
 static ngx_int_t ngx_core_module_init(ngx_cycle_t *cycle);
 static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
@@ -110,11 +114,9 @@ ngx_int_t     ngx_change_binary;
 
 int main(int argc, char *const *argv, char **envp)
 {
-    ngx_fd_t           fd;
     ngx_int_t          i;
     ngx_log_t         *log;
     ngx_cycle_t       *cycle, init_cycle;
-    ngx_open_file_t   *file;
     ngx_core_conf_t   *ccf;
     ngx_master_ctx_t   ctx;
 #if !(WIN32)
@@ -254,6 +256,8 @@ int main(int argc, char *const *argv, ch
 }
 
 
+#if 0
+
 /* TODO: broken NGX_PROCESS_SINGLE */
 
 static void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
@@ -744,6 +748,8 @@ int ngx_worker_thread_cycle(void *data)
 
 #endif
 
+#endif
+
 
 static ngx_int_t ngx_add_inherited_sockets(ngx_cycle_t *cycle, char **envp)
 {
@@ -791,7 +797,7 @@ static ngx_int_t ngx_add_inherited_socke
 }
 
 
-static ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)
+ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv)
 {
     char             *env[2], *var, *p;
     ngx_int_t         i;
@@ -885,8 +891,8 @@ static ngx_int_t ngx_core_module_init(ng
     ccf->daemon = NGX_CONF_UNSET;
     ccf->master = NGX_CONF_UNSET;
     ccf->worker_reopen = NGX_CONF_UNSET;
-    ccf->user = (uid_t) NGX_CONF_UNSET;
-    ccf->group = (gid_t) NGX_CONF_UNSET;
+    ccf->user = (ngx_uid_t) NGX_CONF_UNSET;
+    ccf->group = (ngx_gid_t) NGX_CONF_UNSET;
 
     ((void **)(cycle->conf_ctx))[ngx_core_module.index] = ccf;
 
@@ -896,6 +902,15 @@ static ngx_int_t ngx_core_module_init(ng
 
 static char *ngx_set_user(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
 {
+#if (WIN32)
+
+    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,
+                       "\"user\" is not supported, ignored");
+
+    return NGX_CONF_OK;
+
+#else
+
     struct passwd    *pwd;
     struct group     *grp;
     ngx_str_t        *value;
@@ -932,4 +947,6 @@ static char *ngx_set_user(ngx_conf_t *cf
     ccf->group = grp->gr_gid;
 
     return NGX_CONF_OK;
+
+#endif
 }
--- a/src/core/ngx_atomic.h
+++ b/src/core/ngx_atomic.h
@@ -72,8 +72,8 @@ static ngx_inline uint32_t ngx_atomic_cm
 typedef volatile uint32_t  ngx_atomic_t;
 
 /* STUB */
-#define ngx_atomic_inc(x)   x++;
-#define ngx_atomic_dec(x)   x--;
+#define ngx_atomic_inc(x)   (*(x))++;
+#define ngx_atomic_dec(x)   (*(x))--;
 #define ngx_atomic_cmp_set(lock, old, set)   1;
 /**/
 
--- a/src/core/ngx_connection.c
+++ b/src/core/ngx_connection.c
@@ -248,7 +248,12 @@ ngx_int_t ngx_connection_error(ngx_conne
         return 0;
     }
 
-    if (err == NGX_ECONNRESET || err == NGX_EPIPE || err == NGX_ENOTCONN) {
+    if (err == NGX_ECONNRESET
+#if !(WIN32)
+        || err == NGX_EPIPE
+#endif
+        || err == NGX_ENOTCONN)
+    {
 
         switch (c->log_error) {
 
--- a/src/core/ngx_core.h
+++ b/src/core/ngx_core.h
@@ -21,6 +21,7 @@ typedef struct ngx_connection_s  ngx_con
 #include <ngx_errno.h>
 #include <ngx_process.h>
 #include <ngx_thread.h>
+#include <ngx_user.h>
 #include <ngx_string.h>
 #include <ngx_parse.h>
 #include <ngx_log.h>
@@ -39,6 +40,7 @@ typedef struct ngx_connection_s  ngx_con
 #include <ngx_times.h>
 #include <ngx_inet.h>
 #include <ngx_cycle.h>
+#include <ngx_process_cycle.h>
 #include <ngx_conf_file.h>
 #include <ngx_os.h>
 #include <ngx_connection.h>
--- a/src/core/ngx_cycle.c
+++ b/src/core/ngx_cycle.c
@@ -24,7 +24,6 @@ static ngx_connection_t  dumb;
 ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle)
 {
     ngx_int_t         i, n, failed;
-    ngx_str_t         conf_file;
     ngx_log_t        *log;
     ngx_conf_t        conf;
     ngx_pool_t       *pool;
@@ -227,13 +226,17 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
         }
     }
 
-    /* TODO: Win32 DuplicateHandle ? */
-    if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
+#if (WIN32)
+    /* TODO: TEST */
+    CloseHandle(GetStdHandle(STD_ERROR_HANDLE));
+    SetStdHandle(STD_ERROR_HANDLE, cycle->log->file->fd);
+#else
+    if (dup2(cycle->log->file->fd, STDERR_FILENO) == NGX_ERROR) {
         ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
                       "dup2(STDERR) failed");
         failed = 1;
     }
-
+#endif
 
     if (failed) {
 
@@ -370,7 +373,7 @@ ngx_cycle_t *ngx_init_cycle(ngx_cycle_t 
 }
 
 
-void ngx_reopen_files(ngx_cycle_t *cycle, uid_t user)
+void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user)
 {
     ngx_fd_t          fd;
     ngx_int_t         i;
@@ -395,19 +398,6 @@ void ngx_reopen_files(ngx_cycle_t *cycle
             continue;
         }
 
-        if (user != (uid_t) -1) {
-            if (chown(file[i].name.data, user, -1) == -1) {
-                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
-                              "chown \"%s\" failed", file[i].name.data);
-
-                if (ngx_close_file(fd) == NGX_FILE_ERROR) {
-                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
-                                  ngx_close_file_n " \"%s\" failed",
-                                  file[i].name.data);
-                }
-            }
-        }
-
 #if (WIN32)
         if (ngx_file_append_mode(fd) == NGX_ERROR) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
@@ -423,6 +413,19 @@ void ngx_reopen_files(ngx_cycle_t *cycle
             continue;
         }
 #else
+        if (user != (ngx_uid_t) -1) {
+            if (chown(file[i].name.data, user, -1) == -1) {
+                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                              "chown \"%s\" failed", file[i].name.data);
+
+                if (ngx_close_file(fd) == NGX_FILE_ERROR) {
+                    ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                                  ngx_close_file_n " \"%s\" failed",
+                                  file[i].name.data);
+                }
+            }
+        }
+
         if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
             ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
                           "fcntl(FD_CLOEXEC) \"%s\" failed",
@@ -447,11 +450,16 @@ void ngx_reopen_files(ngx_cycle_t *cycle
         file[i].fd = fd;
     }
 
-    /* TODO: Win32 DuplicateHandle ? */
+#if (WIN32)
+    /* TODO: TEST */
+    CloseHandle(GetStdHandle(STD_ERROR_HANDLE));
+    SetStdHandle(STD_ERROR_HANDLE, cycle->log->file->fd);
+#else
     if (dup2(cycle->log->file->fd, STDERR_FILENO) == -1) {
         ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
                       "dup2(STDERR) failed");
     }
+#endif
 }
 
 
--- a/src/core/ngx_cycle.h
+++ b/src/core/ngx_cycle.h
@@ -25,12 +25,25 @@ struct ngx_cycle_s {
 };
 
 
+typedef struct {
+     ngx_flag_t  daemon;
+     ngx_flag_t  master;
+     ngx_flag_t  worker_reopen;
+     ngx_uid_t   user;
+     ngx_gid_t   group;
+     ngx_str_t   pid;
+     ngx_str_t   newpid;
+} ngx_core_conf_t;
+
+
 ngx_cycle_t *ngx_init_cycle(ngx_cycle_t *old_cycle);
-void ngx_reopen_files(ngx_cycle_t *cycle, uid_t user);
+void ngx_reopen_files(ngx_cycle_t *cycle, ngx_uid_t user);
+ngx_pid_t ngx_exec_new_binary(ngx_cycle_t *cycle, char *const *argv);
 
 
 extern volatile ngx_cycle_t  *ngx_cycle;
 extern ngx_array_t            ngx_old_cycles;
+extern ngx_module_t           ngx_core_module;
 
 
 #endif /* _NGX_CYCLE_H_INCLUDED_ */
--- a/src/core/ngx_log.c
+++ b/src/core/ngx_log.c
@@ -47,10 +47,10 @@ static const char *debug_levels[] = {
 
 
 #if (HAVE_VARIADIC_MACROS)
-void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, ...)
 #else
-void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, va_list args)
 #endif
 {
@@ -176,7 +176,7 @@ static void ngx_log_write(ngx_log_t *log
 
 #if !(HAVE_VARIADIC_MACROS)
 
-void ngx_log_error(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                    const char *fmt, ...)
 {
     va_list    args;
--- a/src/core/ngx_log.h
+++ b/src/core/ngx_log.h
@@ -92,7 +92,7 @@ struct ngx_log_s {
 #define ngx_log_error(level, log, args...) \
         if (log->log_level >= level) ngx_log_error_core(level, log, args)
 
-void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, ...);
 
 /*********************************/
@@ -104,7 +104,7 @@ void ngx_log_error_core(int level, ngx_l
 #define ngx_log_error(level, log, ...) \
         if (log->log_level >= level) ngx_log_error_core(level, log, __VA_ARGS__)
 
-void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, ...);
 
 /*********************************/
@@ -113,9 +113,9 @@ void ngx_log_error_core(int level, ngx_l
 
 #define HAVE_VARIADIC_MACROS  0
 
-void ngx_log_error(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                    const char *fmt, ...);
-void ngx_log_error_core(int level, ngx_log_t *log, ngx_err_t err,
+void ngx_log_error_core(ngx_uint_t level, ngx_log_t *log, ngx_err_t err,
                         const char *fmt, va_list args);
 void ngx_log_debug_core(ngx_log_t *log, ngx_err_t err, const char *fmt, ...);
 void ngx_assert_core(ngx_log_t *log, const char *fmt, ...);
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -1,6 +1,6 @@
 
 /*
- * Copyright (C) 2002-2003 Igor Sysoev, http://sysoev.ru
+ * Copyright (C) 2002-2004 Igor Sysoev, http://sysoev.ru/en/
  */
 
 
@@ -10,11 +10,11 @@
 #include <ngx_iocp_module.h>
 
 
-static int ngx_iocp_init(ngx_cycle_t *cycle);
+static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle);
 static void ngx_iocp_done(ngx_cycle_t *cycle);
-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, u_int flags);
-static int ngx_iocp_process_events(ngx_log_t *log);
+static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key);
+static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags);
+static ngx_int_t ngx_iocp_process_events(ngx_log_t *log);
 static void *ngx_iocp_create_conf(ngx_cycle_t *cycle);
 static char *ngx_iocp_init_conf(ngx_cycle_t *cycle, void *conf);
 
@@ -89,7 +89,7 @@ ngx_os_io_t ngx_iocp_io = {
 static HANDLE  iocp;
 
 
-static int ngx_iocp_init(ngx_cycle_t *cycle)
+static ngx_int_t ngx_iocp_init(ngx_cycle_t *cycle)
 {
     ngx_iocp_conf_t  *cf;
 
@@ -106,10 +106,6 @@ static int ngx_iocp_init(ngx_cycle_t *cy
         return NGX_ERROR;
     }
 
-    if (ngx_event_timer_init(cycle) == NGX_ERROR) {
-        return NGX_ERROR;
-    }
-
     ngx_io = ngx_iocp_io;
 
     ngx_event_actions = ngx_iocp_module_ctx.actions;
@@ -128,12 +124,10 @@ static void ngx_iocp_done(ngx_cycle_t *c
     }
 
     iocp = NULL;
-
-    ngx_event_timer_done(cycle);
 }
 
 
-static int ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key)
+static ngx_int_t ngx_iocp_add_event(ngx_event_t *ev, int event, u_int key)
 {
     ngx_connection_t  *c;
 
@@ -142,7 +136,8 @@ static int ngx_iocp_add_event(ngx_event_
     c->read->active = 1;
     c->write->active = 1;
 
-    ngx_log_debug(ev->log, "iocp add: %d, %d:%08x" _ c->fd _ key _ &ev->ovlp);
+    ngx_log_debug3(NGX_LOG_DEBUG_EVENT, ev->log, 0,
+                   "iocp add: fd:%d k:%d ov:" PTR_FMT, c->fd, key, &ev->ovlp);
 
     if (CreateIoCompletionPort((HANDLE) c->fd, iocp, key, 0) == NULL) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno,
@@ -154,7 +149,7 @@ static int ngx_iocp_add_event(ngx_event_
 }
 
 
-static int ngx_iocp_del_connection(ngx_connection_t *c, u_int flags)
+static ngx_int_t ngx_iocp_del_connection(ngx_connection_t *c, u_int flags)
 {
     if (CancelIo((HANDLE) c->fd) == 0) {
         ngx_log_error(NGX_LOG_ALERT, c->log, ngx_errno, "CancelIo() failed");
@@ -165,7 +160,7 @@ static int ngx_iocp_del_connection(ngx_c
 }
 
 
-static int ngx_iocp_process_events(ngx_log_t *log)
+static ngx_int_t ngx_iocp_process_events(ngx_log_t *log)
 {
     int                rc;
     u_int              key;
@@ -178,23 +173,17 @@ static int ngx_iocp_process_events(ngx_l
     ngx_event_ovlp_t  *ovlp;
 
     timer = ngx_event_find_timer();
+    ngx_old_elapsed_msec = ngx_elapsed_msec;
 
-    if (timer) {
-        ngx_gettimeofday(&tv);
-        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
-
-    } else {
+    if (timer == 0) {
         timer = INFINITE;
-        delta = 0;
     }
 
-    ngx_log_debug(log, "iocp timer: %d" _ timer);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp timer: %d", timer);
 
     rc = GetQueuedCompletionStatus(iocp, &bytes, (LPDWORD) &key,
                                    (LPOVERLAPPED *) &ovlp, timer);
 
-    ngx_log_debug(log, "iocp: %d, %d, %d:%08x" _ rc _ bytes _ key _ ovlp);
-
     if (rc == 0) {
         err = ngx_errno;
     } else {
@@ -202,16 +191,13 @@ static int ngx_iocp_process_events(ngx_l
     }
 
     ngx_gettimeofday(&tv);
+    ngx_time_update(tv.tv_sec);
 
-    if (ngx_cached_time != tv.tv_sec) {
-        ngx_cached_time = tv.tv_sec;
-        ngx_time_update();
-    }
+    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, log, 0,
+                   "iocp: %d b:%d k:%d ov:" PTR_FMT, rc, bytes, key, ovlp);
 
-    if (timer != INFINITE) {
-        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
-        ngx_event_expire_timers((ngx_msec_t) delta);
-    }
+    delta = ngx_elapsed_msec;
+    ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec;
 
     if (err) {
         if (ovlp == NULL) {
@@ -227,12 +213,20 @@ static int ngx_iocp_process_events(ngx_l
         }
     }
 
+    if (timer != INFINITE) {
+        delta = ngx_elapsed_msec - delta;
+
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, log, 0,
+                       "iocp timer: %d, delta: %d", timer, (int) delta);
+    }
+
     if (ovlp) {
         ev = ovlp->event;
 
-ngx_log_debug(log, "iocp ev: %08x" _ ev);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "iocp event:" PTR_FMT, ev);
 
         switch (key) {
+
         case NGX_IOCP_ACCEPT:
             if (bytes) {
                 ev->ready = 1;
@@ -250,11 +244,16 @@ ngx_log_debug(log, "iocp ev: %08x" _ ev)
 
         ev->available = bytes;
 
-ngx_log_debug(log, "iocp ev handler: %08x" _ ev->event_handler);
+        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0,
+                       "iocp event handler: %08x" PTR_FMT, ev->event_handler);
 
         ev->event_handler(ev);
     }
 
+    if (timer != INFINITE && delta) {
+        ngx_event_expire_timers((ngx_msec_t) delta);
+    }
+
     return NGX_OK;
 }
 
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -361,8 +361,12 @@ static int ngx_select_process_events(ngx
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, "select ready %d", ready);
 
     if (err) {
+#if (WIN32)
+        ngx_log_error(NGX_LOG_ALERT, log, err, "select() failed");
+#else
         ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT,
                       log, err, "select() failed");
+#endif
         return NGX_ERROR;
     }
 
--- a/src/event/ngx_event_acceptex.c
+++ b/src/event/ngx_event_acceptex.c
@@ -70,7 +70,9 @@ int ngx_event_post_acceptex(ngx_listenin
         /* TODO: look up reused sockets */
 
         s = ngx_socket(ls->family, ls->type, ls->protocol, ls->flags);
-        ngx_log_debug(ls->log, ngx_socket_n ": %d:%d" _ s _ ls->flags);
+
+        ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ls->log, 0,
+                       ngx_socket_n " s:%d fl:%d", s, ls->flags);
 
         if (s == -1) {
             ngx_log_error(NGX_LOG_ALERT, ls->log, ngx_socket_errno,
--- a/src/http/modules/ngx_http_ssi_filter.c
+++ b/src/http/modules/ngx_http_ssi_filter.c
@@ -21,6 +21,7 @@ typedef struct {
 
 
 typedef struct {
+    int               dummy;
 } ngx_http_ssi_command_t;
 
 
--- a/src/os/unix/ngx_aio_read.c
+++ b/src/os/unix/ngx_aio_read.c
@@ -25,7 +25,7 @@ ssize_t ngx_aio_read(ngx_connection_t *c
     rev = c->read;
 
     if (!rev->ready) {
-        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "SECOND AIO POST");
+        ngx_log_error(NGX_LOG_ALERT, c->log, 0, "second aio post");
         return NGX_AGAIN;
     }
 
--- a/src/os/unix/ngx_files.c
+++ b/src/os/unix/ngx_files.c
@@ -1,10 +1,6 @@
 
 #include <ngx_config.h>
 #include <ngx_core.h>
-#include <ngx_hunk.h>
-#include <ngx_array.h>
-#include <ngx_file.h>
-#include <ngx_files.h>
 
 
 ssize_t ngx_read_file(ngx_file_t *file, char *buf, size_t size, off_t offset)
--- a/src/os/unix/ngx_files.h
+++ b/src/os/unix/ngx_files.h
@@ -3,11 +3,7 @@
 
 
 #include <ngx_config.h>
-
-#include <ngx_types.h>
-#include <ngx_alloc.h>
-#include <ngx_hunk.h>
-#include <ngx_file.h>
+#include <ngx_core.h>
 
 
 #define NGX_INVALID_FILE         -1
--- a/src/os/unix/ngx_os.h
+++ b/src/os/unix/ngx_os.h
@@ -49,6 +49,8 @@ extern int          ngx_max_sockets;
 extern int          ngx_inherited_nonblocking;
 
 
+#if 0
+
 extern ngx_int_t    ngx_process;
 extern ngx_pid_t    ngx_new_binary;
 
@@ -62,6 +64,8 @@ extern ngx_int_t    ngx_reconfigure;
 extern ngx_int_t    ngx_reopen;
 extern ngx_int_t    ngx_change_binary;
 
+#endif
+
 
 #ifdef __FreeBSD__
 #include <ngx_freebsd.h>
--- a/src/os/unix/ngx_process.h
+++ b/src/os/unix/ngx_process.h
@@ -29,10 +29,6 @@ typedef struct {
 } ngx_exec_ctx_t;
 
 
-#define NGX_PROCESS_SINGLE   0
-#define NGX_PROCESS_MASTER   1
-#define NGX_PROCESS_WORKER   2
-
 #define NGX_MAX_PROCESSES  1024
 
 #define NGX_PROCESS_NORESPAWN  -1
new file mode 100644
--- /dev/null
+++ b/src/os/unix/ngx_process_cycle.c
@@ -0,0 +1,517 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+
+
+static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx);
+static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data);
+#if (NGX_THREADS)
+static int ngx_worker_thread_cycle(void *data);
+#endif
+
+
+ngx_int_t     ngx_process;
+ngx_pid_t     ngx_pid;
+ngx_pid_t     ngx_new_binary;
+ngx_int_t     ngx_inherited;
+
+sig_atomic_t  ngx_reap;
+sig_atomic_t  ngx_timer;
+sig_atomic_t  ngx_terminate;
+sig_atomic_t  ngx_quit;
+sig_atomic_t  ngx_noaccept;
+sig_atomic_t  ngx_reconfigure;
+sig_atomic_t  ngx_reopen;
+sig_atomic_t  ngx_change_binary;
+
+
+/* TODO: broken NGX_PROCESS_SINGLE */
+
+void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
+{
+    int                signo;
+    sigset_t           set;
+    struct timeval     tv;
+    struct itimerval   itv;
+    ngx_uint_t         i, live;
+    ngx_msec_t         delay;
+    ngx_core_conf_t   *ccf;
+
+    sigemptyset(&set);
+    sigaddset(&set, SIGCHLD);
+    sigaddset(&set, SIGALRM);
+    sigaddset(&set, SIGINT);
+    sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));
+    sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));
+    sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));
+    sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));
+    sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));
+    sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));
+
+    if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "sigprocmask() failed");
+    }
+
+    sigemptyset(&set);
+
+    ngx_setproctitle("master process");
+
+    ngx_new_binary = 0;
+    delay = 0;
+    signo = 0;
+    live = 0;
+
+    for ( ;; ) {
+        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "new cycle");
+
+        if (ngx_process == NGX_PROCESS_MASTER) {
+            ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,
+                              "worker process", NGX_PROCESS_RESPAWN);
+
+            /*
+             * we have to limit the maximum life time of the worker processes
+             * by 1 month because our millisecond event timer is limited
+             * by 49 days on 32-bit platforms
+             */
+
+            itv.it_interval.tv_sec = 0;
+            itv.it_interval.tv_usec = 0;
+            itv.it_value.tv_sec = 30 * 24 * 60 * 60;
+            itv.it_value.tv_usec = 0;
+
+            if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
+                ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                              "setitimer() failed");
+            }
+
+            live = 1;
+
+        } else {
+            ngx_init_temp_number();
+
+            for (i = 0; ngx_modules[i]; i++) {
+                if (ngx_modules[i]->init_process) {
+                    if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
+                        /* fatal */
+                        exit(1);
+                    }
+                }
+            }
+        }
+
+        ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx,
+                                               ngx_core_module);
+
+        /* a cycle with the same configuration because a new one is invalid */
+
+        for ( ;; ) {
+
+            /* an event loop */
+
+            for ( ;; ) {
+
+                if (ngx_process == NGX_PROCESS_MASTER) {
+                    if (delay) {
+                        delay *= 2;
+
+                        ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                       "temination cycle: %d", delay);
+
+                        itv.it_interval.tv_sec = 0;
+                        itv.it_interval.tv_usec = 0;
+                        itv.it_value.tv_sec = delay / 1000;
+                        itv.it_value.tv_usec = (delay % 1000 ) * 1000;
+
+                        if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
+                            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                                          "setitimer() failed");
+                        }
+                    }
+
+                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                   "sigsuspend");
+
+                    sigsuspend(&set);
+
+                    ngx_gettimeofday(&tv);
+                    ngx_time_update(tv.tv_sec);
+
+                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                   "wake up");
+
+                } else { /* NGX_PROCESS_SINGLE */
+                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                   "worker cycle");
+
+                    ngx_process_events(cycle->log);
+                    live = 0;
+                }
+
+                if (ngx_reap) {
+                    ngx_reap = 0;
+                    ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                   "reap childs");
+
+                    live = 0;
+                    for (i = 0; i < ngx_last_process; i++) {
+
+                        ngx_log_debug5(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
+                                       "child: " PID_T_FMT
+                                       " e:%d t:%d d:%d r:%d",
+                                       ngx_processes[i].pid,
+                                       ngx_processes[i].exiting,
+                                       ngx_processes[i].exited,
+                                       ngx_processes[i].detached,
+                                       ngx_processes[i].respawn);
+
+                        if (ngx_processes[i].exited) {
+
+                            if (ngx_processes[i].respawn
+                                && !ngx_processes[i].exiting
+                                && !ngx_terminate
+                                && !ngx_quit)
+                            {
+                                 if (ngx_spawn_process(cycle,
+                                                       ngx_processes[i].proc,
+                                                       ngx_processes[i].data,
+                                                       ngx_processes[i].name, i)
+                                                                  == NGX_ERROR)
+                                 {
+                                     ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
+                                                   "can not respawn %s",
+                                                   ngx_processes[i].name);
+                                     continue;
+                                 }
+
+                                 live = 1;
+
+                                 continue;
+                            }
+
+                            if (ngx_processes[i].pid == ngx_new_binary) {
+                                ngx_new_binary = 0;
+
+                                /* TODO: if (ngx_noaccept) ngx_configure = 1 */
+                            }
+
+                            if (i != --ngx_last_process) {
+                                ngx_processes[i--] =
+                                               ngx_processes[ngx_last_process];
+                            }
+
+                        } else if (ngx_processes[i].exiting
+                                   || !ngx_processes[i].detached)
+                        {
+                            live = 1;
+                        }
+                    }
+                }
+
+                if (!live && (ngx_terminate || ngx_quit)) {
+                    ngx_master_exit(cycle, ctx);
+                }
+
+                if (ngx_terminate) {
+                    if (delay == 0) {
+                        delay = 50;
+                    }
+
+                    if (delay > 1000) {
+                        signo = SIGKILL;
+                    } else {
+                        signo = ngx_signal_value(NGX_TERMINATE_SIGNAL);
+                    }
+
+                } else if (ngx_quit) {
+                    signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
+
+                } else if (ngx_timer) {
+                    signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
+
+                } else {
+
+                    if (ngx_noaccept) {
+                        signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
+                    }
+
+                    if (ngx_change_binary) {
+                        ngx_change_binary = 0;
+                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+                                      "changing binary");
+                        ngx_new_binary = ngx_exec_new_binary(cycle, ctx->argv);
+                    }
+
+                    if (ngx_reconfigure) {
+                        signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
+                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+                                      "reconfiguring");
+                    }
+
+                    if (ngx_reopen) {
+                        if (ngx_process == NGX_PROCESS_MASTER) {
+                            if (ccf->worker_reopen != 0) {
+                                signo = ngx_signal_value(NGX_REOPEN_SIGNAL);
+                                ngx_reopen = 0;
+
+                            } else if (ngx_noaccept) {
+                                ngx_reopen = 0;
+
+                            } else {
+                                signo = ngx_signal_value(NGX_SHUTDOWN_SIGNAL);
+                            }
+
+                        } else { /* NGX_PROCESS_SINGLE */
+                            ngx_reopen = 0;
+                        }
+
+                        ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+                                      "reopening logs");
+                        ngx_reopen_files(cycle,
+                             ccf->worker_reopen != 0 ? ccf->user : (uid_t) -1);
+                    }
+                }
+
+                if (signo) {
+                    for (i = 0; i < ngx_last_process; i++) {
+
+                        if (ngx_processes[i].detached) {
+                            continue;
+                        }
+
+                        ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,
+                                       "kill (" PID_T_FMT ", %d)" ,
+                                       ngx_processes[i].pid, signo);
+
+                        if (kill(ngx_processes[i].pid, signo) == -1) {
+                            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                                          "kill(%d, %d) failed",
+                                          ngx_processes[i].pid, signo);
+                            continue;
+                        }
+
+                        if (signo != ngx_signal_value(NGX_REOPEN_SIGNAL)) {
+                            ngx_processes[i].exiting = 1;
+                        }
+                    }
+
+                    signo = 0;
+                }
+
+                if (ngx_reopen || ngx_reconfigure || ngx_timer) {
+                    break;
+                }
+            }
+
+            if (ngx_reopen) {
+                ngx_reopen = 0;
+
+            } else if (ngx_timer) {
+                ngx_timer = 0;
+
+            } else if (ngx_noaccept) {
+                ngx_noaccept = 0;
+                ngx_reconfigure = 0;
+
+            } else {
+                cycle = ngx_init_cycle(cycle);
+                if (cycle == NULL) {
+                    cycle = (ngx_cycle_t *) ngx_cycle;
+                    continue;
+                }
+
+                ngx_cycle = cycle;
+                ngx_reconfigure = 0;
+            }
+
+            break;
+        }
+    }
+}
+
+
+static void ngx_master_exit(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
+{
+    char  *name;
+
+    if (ngx_inherited && getppid() > 1) {
+        name = ctx->pid.name.data;
+
+    } else {
+        name = ctx->name;
+    }
+
+    if (ngx_delete_file(name) == NGX_FILE_ERROR) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      ngx_delete_file_n " \"%s\" failed", name);
+    }
+
+    ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exit");
+    exit(0);
+}
+
+
+static void ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
+{
+    sigset_t          set;
+    ngx_int_t         i;
+    ngx_listening_t  *ls;
+    ngx_core_conf_t  *ccf;
+#if (NGX_THREADS)
+    ngx_tid_t         tid;
+#endif
+
+    ngx_process = NGX_PROCESS_WORKER;
+    ngx_last_process = 0;
+
+    ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
+
+    if (ccf->group != (gid_t) NGX_CONF_UNSET) {
+        if (setuid(ccf->group) == -1) {
+            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                          "setgid(%d) failed", ccf->group);
+            /* fatal */
+            exit(2);
+        }
+    }
+
+    if (ccf->user != (uid_t) NGX_CONF_UNSET && geteuid() == 0) {
+        if (setuid(ccf->user) == -1) {
+            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,
+                          "setuid(%d) failed", ccf->user);
+            /* fatal */
+            exit(2);
+        }
+    }
+
+#if (HAVE_PR_SET_DUMPABLE)
+
+    /* allow coredump after setuid() in Linux 2.4.x */
+
+    if (prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "prctl(PR_SET_DUMPABLE) failed");
+    }
+
+#endif
+
+    sigemptyset(&set);
+
+    if (sigprocmask(SIG_SETMASK, &set, NULL) == -1) {
+        ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,
+                      "sigprocmask() failed");
+    }
+
+    ngx_init_temp_number();
+
+    /*
+     * disable deleting previous events for the listening sockets because
+     * in the worker processes there are no events at all at this point
+     */ 
+    ls = cycle->listening.elts;
+    for (i = 0; i < cycle->listening.nelts; i++) {
+        ls[i].remain = 0;
+    }
+
+    for (i = 0; ngx_modules[i]; i++) {
+        if (ngx_modules[i]->init_process) {
+            if (ngx_modules[i]->init_process(cycle) == NGX_ERROR) {
+                /* fatal */
+                exit(1);
+            }
+        }
+    }
+
+    ngx_setproctitle("worker process");
+
+#if (NGX_THREADS)
+
+    if (ngx_init_threads(5, 128 * 1024 * 1024, cycle) == NGX_ERROR) {
+        /* fatal */
+        exit(1);
+    }
+
+    for (i = 0; i < 1; i++) {
+        if (ngx_create_thread(&tid, ngx_worker_thread_cycle,
+                              cycle, cycle->log) != 0)
+        {
+            /* fatal */
+            exit(1);
+        }
+    }
+
+#endif
+
+    for ( ;; ) {
+        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
+
+        ngx_process_events(cycle->log);
+
+        if (ngx_terminate) {
+            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+            exit(0);
+        }
+
+        if (ngx_quit) {
+            ngx_log_error(NGX_LOG_INFO, cycle->log, 0,
+                          "gracefully shutting down");
+            ngx_setproctitle("worker process is shutting down");
+            break;
+        }
+
+        if (ngx_reopen) {
+            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
+            ngx_reopen_files(cycle, -1);
+            ngx_reopen = 0;
+        }
+    }
+
+    ngx_close_listening_sockets(cycle);
+
+    for ( ;; ) {
+        if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
+            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "exiting");
+            exit(0);
+        }
+
+        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "worker cycle");
+
+        ngx_process_events(cycle->log);
+
+        if (ngx_reopen) {
+            ngx_log_error(NGX_LOG_INFO, cycle->log, 0, "reopen logs");
+            ngx_reopen_files(cycle, -1);
+            ngx_reopen = 0;
+        }
+    }
+}
+
+
+#if (NGX_THREADS)
+
+int ngx_worker_thread_cycle(void *data)
+{
+    ngx_cycle_t *cycle = data;
+
+    struct timeval  tv;
+
+    /* STUB */
+
+    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, ngx_errno,
+                   "thread %d started", ngx_thread_self());
+
+    ngx_setproctitle("worker thread");
+
+    sleep(5);
+
+    ngx_gettimeofday(&tv);
+    ngx_time_update(tv.tv_sec);
+
+    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, ngx_errno,
+                   "thread %d done", ngx_thread_self());
+
+    return 1;
+}
+
+#endif
new file mode 100644
--- /dev/null
+++ b/src/os/unix/ngx_process_cycle.h
@@ -0,0 +1,40 @@
+#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_
+#define _NGX_PROCESS_CYCLE_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+typedef struct {
+     ngx_file_t    pid;
+     char         *name;
+     int           argc;
+     char *const  *argv;
+} ngx_master_ctx_t;
+
+
+#define NGX_PROCESS_SINGLE   0
+#define NGX_PROCESS_MASTER   1
+#define NGX_PROCESS_WORKER   2
+
+
+void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx);
+
+
+extern ngx_int_t       ngx_process;
+extern ngx_pid_t       ngx_pid;
+extern ngx_pid_t       ngx_new_binary;
+extern ngx_int_t       ngx_inherited;
+
+extern sig_atomic_t    ngx_reap;
+extern sig_atomic_t    ngx_timer;
+extern sig_atomic_t    ngx_quit;
+extern sig_atomic_t    ngx_terminate;
+extern sig_atomic_t    ngx_noaccept;
+extern sig_atomic_t    ngx_reconfigure;
+extern sig_atomic_t    ngx_reopen;
+extern sig_atomic_t    ngx_change_binary;
+
+
+#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */
new file mode 100644
--- /dev/null
+++ b/src/os/unix/ngx_user.h
@@ -0,0 +1,13 @@
+#ifndef _NGX_USER_H_INCLUDED_
+#define _NGX_USER_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+typedef uid_t  ngx_uid_t;
+typedef gid_t  ngx_gid_t;
+
+
+#endif /* _NGX_USER_H_INCLUDED_ */
--- a/src/os/win32/ngx_errno.h
+++ b/src/os/win32/ngx_errno.h
@@ -17,10 +17,13 @@ typedef DWORD                      ngx_e
 #define NGX_EACCES                 ERROR_ACCESS_DENIED
 #define NGX_EEXIST                 ERROR_FILE_EXISTS
 #define NGX_ENOTDIR                ERROR_PATH_NOT_FOUND
+#define NGX_EPIPE                  EPIPE
 #define NGX_EAGAIN                 WSAEWOULDBLOCK
 #define NGX_EINPROGRESS            WSAEINPROGRESS
 #define NGX_EADDRINUSE             WSAEADDRINUSE
-#define NGX_ECONNRESET             ECONNRESET
+#define NGX_ECONNABORTED           WSAECONNABORTED
+#define NGX_ECONNRESET             WSAECONNRESET
+#define NGX_ENOTCONN               WSAENOTCONN
 #define NGX_ETIMEDOUT              WSAETIMEDOUT
 #define NGX_ENOMOREFILES           ERROR_NO_MORE_FILES
 
--- a/src/os/win32/ngx_files.h
+++ b/src/os/win32/ngx_files.h
@@ -21,8 +21,6 @@
 #define NGX_FILE_ERROR              0
 
 
-#define STDERR_FILENO               (HANDLE) 2
-
 
 #define ngx_open_file(name, access, create)                                 \
             CreateFile(name, access,                                        \
--- a/src/os/win32/ngx_os.h
+++ b/src/os/win32/ngx_os.h
@@ -46,8 +46,13 @@ extern int          ngx_inherited_nonblo
 extern int          ngx_win32_version;
 
 
-extern int          reconfigure;
-extern int          reopen;
+extern ngx_int_t    ngx_process;
+
+extern ngx_int_t    ngx_quit;
+extern ngx_int_t    ngx_terminate;
+
+extern ngx_int_t    ngx_reconfigure;
+extern ngx_int_t    ngx_reopen;
 
 
 
new file mode 100644
--- /dev/null
+++ b/src/os/win32/ngx_process.c
@@ -0,0 +1,9 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+ngx_pid_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx)
+{
+    return /* STUB */ 0;
+}
--- a/src/os/win32/ngx_process.h
+++ b/src/os/win32/ngx_process.h
@@ -2,7 +2,29 @@
 #define _NGX_PROCESS_H_INCLUDED_
 
 
-#define ngx_getpid  GetCurrentProcessId
+typedef DWORD        ngx_pid_t;
+
+#define ngx_getpid   GetCurrentProcessId
+#define ngx_log_pid  ngx_pid
+
+
+typedef struct {
+    char         *path;
+    char         *name;
+    char *const  *argv;
+    char *const  *envp;
+} ngx_exec_ctx_t;
+
+
+#define NGX_PROCESS_SINGLE   0
+#define NGX_PROCESS_MASTER   1
+#define NGX_PROCESS_WORKER   2
+
+
+ngx_pid_t ngx_exec(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx);
+
+
+extern ngx_pid_t     ngx_pid;
 
 
 #endif /* _NGX_PROCESS_H_INCLUDED_ */
new file mode 100644
--- /dev/null
+++ b/src/os/win32/ngx_process_cycle.c
@@ -0,0 +1,28 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+
+
+#if 0
+
+ngx_int_t     ngx_process;
+ngx_pid_t     ngx_pid;
+ngx_pid_t     ngx_new_binary;
+ngx_int_t     ngx_inherited;
+
+sig_atomic_t  ngx_reap;
+sig_atomic_t  ngx_timer;
+sig_atomic_t  ngx_terminate;
+sig_atomic_t  ngx_quit;
+sig_atomic_t  ngx_noaccept;
+sig_atomic_t  ngx_reconfigure;
+sig_atomic_t  ngx_reopen;
+sig_atomic_t  ngx_change_binary;
+
+#endif
+
+
+void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx)
+{
+}
new file mode 100644
--- /dev/null
+++ b/src/os/win32/ngx_process_cycle.h
@@ -0,0 +1,40 @@
+#ifndef _NGX_PROCESS_CYCLE_H_INCLUDED_
+#define _NGX_PROCESS_CYCLE_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+typedef struct {
+     ngx_file_t    pid;
+     char         *name;
+     int           argc;
+     char *const  *argv;
+} ngx_master_ctx_t;
+
+
+#define NGX_PROCESS_SINGLE   0
+#define NGX_PROCESS_MASTER   1
+#define NGX_PROCESS_WORKER   2
+
+
+void ngx_master_process_cycle(ngx_cycle_t *cycle, ngx_master_ctx_t *ctx);
+
+
+extern ngx_int_t       ngx_process;
+extern ngx_pid_t       ngx_pid;
+extern ngx_pid_t       ngx_new_binary;
+extern ngx_int_t       ngx_inherited;
+
+extern sig_atomic_t    ngx_reap;
+extern sig_atomic_t    ngx_timer;
+extern sig_atomic_t    ngx_quit;
+extern sig_atomic_t    ngx_terminate;
+extern sig_atomic_t    ngx_noaccept;
+extern sig_atomic_t    ngx_reconfigure;
+extern sig_atomic_t    ngx_reopen;
+extern sig_atomic_t    ngx_change_binary;
+
+
+#endif /* _NGX_PROCESS_CYCLE_H_INCLUDED_ */
new file mode 100644
--- /dev/null
+++ b/src/os/win32/ngx_thread.h
@@ -0,0 +1,26 @@
+#ifndef _NGX_THREAD_H_INCLUDED_
+#define _NGX_THREAD_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+#if (NGX_THREADS)
+
+#define ngx_thread_volatile  volatile
+
+#else /* !NGX_THREADS */
+
+#define ngx_thread_volatile
+
+#define ngx_log_tid  0
+#define TID_T_FMT    "%d"
+
+#define ngx_mutex_lock(m)     NGX_OK
+#define ngx_mutex_unlock(m)
+
+#endif
+
+
+#endif /* _NGX_THREAD_H_INCLUDED_ */
new file mode 100644
--- /dev/null
+++ b/src/os/win32/ngx_user.h
@@ -0,0 +1,14 @@
+#ifndef _NGX_USER_H_INCLUDED_
+#define _NGX_USER_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+/* STUB */
+#define ngx_uid_t  ngx_int_t
+#define ngx_gid_t  ngx_int_t
+
+
+#endif /* _NGX_USER_H_INCLUDED_ */
--- a/src/os/win32/ngx_win32_config.h
+++ b/src/os/win32/ngx_win32_config.h
@@ -4,8 +4,6 @@
 
 #define WIN32       1
 
-#define NGX_WIN_NT  200000
-
 #define STRICT
 #define WIN32_LEAN_AND_MEAN
 
@@ -36,16 +34,19 @@
 #pragma warning(disable:4127)
 #endif
 
+#include <ngx_auto_config.h>
+
 
 #define ngx_inline   __inline
 
 
-#if 0
-/* owc have not __int32 */
+#if 1
 typedef unsigned __int32  uint32_t;
 #else
+/* OWC has not __int32 */
 typedef unsigned int      uint32_t;
 #endif
+
 typedef __int64           int64_t;
 typedef unsigned __int64  uint64_t;
 typedef u_int             uintptr_t;
@@ -54,6 +55,7 @@ typedef int               ssize_t;
 typedef long              time_t;
 typedef __int64           off_t;
 typedef uint32_t          in_addr_t;
+typedef int               sig_atomic_t;
 
 
 #define OFF_T_FMT         "%I64d"
@@ -61,8 +63,11 @@ typedef uint32_t          in_addr_t;
 #define SIZE_T_X_FMT      "%x"
 #define PID_T_FMT         "%d"
 #define TIME_T_FMT        "%lu"
+#define PTR_FMT           "%08X"
 
 
+#define NGX_WIN_NT        200000
+
 
 #ifndef HAVE_INHERITED_NONBLOCK
 #define HAVE_INHERITED_NONBLOCK  1
--- a/src/os/win32/ngx_wsarecv.c
+++ b/src/os/win32/ngx_wsarecv.c
@@ -20,7 +20,8 @@ ssize_t ngx_wsarecv(ngx_connection_t *c,
 
     rc = WSARecv(c->fd, wsabuf, 1, &bytes, &flags, NULL, NULL);
 
-    ngx_log_debug(c->log, "WSARecv: %d:%d" _ rc _ bytes);
+    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "WSARecv: fd:%d rc:%d %d of %d", c->fd, rc, bytes, size);
 
     rev = c->read;
 
@@ -29,12 +30,14 @@ ssize_t ngx_wsarecv(ngx_connection_t *c,
         err = ngx_socket_errno;
 
         if (err == WSAEWOULDBLOCK) {
-            ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN");
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                           "WSARecv() not ready");
             return NGX_AGAIN;
         }
 
         rev->error = 1;
-        ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed");
+        ngx_connection_error(c, err, "WSARecv() failed");
+
         return NGX_ERROR;
     }
 
@@ -63,19 +66,19 @@ ssize_t ngx_overlapped_wsarecv(ngx_conne
     rev = c->read;
 
     if (!rev->ready) {
-        ngx_log_error(NGX_LOG_ALERT, rev->log, 0, "SECOND WSA POST");
+        ngx_log_error(NGX_LOG_ALERT, rev->log, 0, "second wsa post");
         return NGX_AGAIN;
     }
 
-    ngx_log_debug(c->log, "rev->complete: %d" _ rev->complete);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "rev->complete: %d", rev->complete);
 
     if (rev->complete) {
         rev->complete = 0;
 
         if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
             if (rev->ovlp.error) {
-                ngx_log_error(NGX_LOG_ERR, c->log, rev->ovlp.error,
-                              "WSARecv() failed");
+                ngx_connection_error(c, rev->ovlp.error, "WSARecv() failed");
                 return NGX_ERROR;
             }
 
@@ -84,9 +87,8 @@ ssize_t ngx_overlapped_wsarecv(ngx_conne
 
         if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &rev->ovlp,
                                    &bytes, 0, NULL) == 0) {
-            ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
-                         "WSARecv() or WSAGetOverlappedResult() failed");
-
+            ngx_connection_error(c, ngx_socket_errno,
+                               "WSARecv() or WSAGetOverlappedResult() failed");
             return NGX_ERROR;
         }
 
@@ -104,7 +106,8 @@ ssize_t ngx_overlapped_wsarecv(ngx_conne
 
     rev->complete = 0;
 
-    ngx_log_debug(c->log, "WSARecv: %d:%d" _ rc _ bytes);
+    ngx_log_debug4(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "WSARecv: fd:%d rc:%d %d of %d", c->fd, rc, bytes, size);
 
     if (rc == -1) {
         err = ngx_socket_errno;
@@ -114,7 +117,7 @@ ssize_t ngx_overlapped_wsarecv(ngx_conne
         }
 
         rev->error = 1;
-        ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed");
+        ngx_connection_error(c, err, "WSARecv() failed");
         return NGX_ERROR;
     }
 
--- a/src/os/win32/ngx_wsarecv_chain.c
+++ b/src/os/win32/ngx_wsarecv_chain.c
@@ -40,7 +40,9 @@ ssize_t ngx_wsarecv_chain(ngx_connection
         chain = chain->next;
     }
 
-ngx_log_debug(c->log, "WSARecv: %d:%d" _ io.nelts _ wsabuf->len);
+    ngx_log_debug2(NGX_LOG_DEBUG_EVENT, c->log, 0,
+                   "WSARecv: %d:%d", io.nelts, wsabuf->len);
+
 
     rc = WSARecv(c->fd, io.elts, io.nelts, &bytes, &flags, NULL, NULL);
 
@@ -51,12 +53,13 @@ ngx_log_debug(c->log, "WSARecv: %d:%d" _
         err = ngx_socket_errno;
 
         if (err == WSAEWOULDBLOCK) {
-            ngx_log_error(NGX_LOG_INFO, c->log, err, "WSARecv() EAGAIN");
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                           "WSARecv() not ready");
             return NGX_AGAIN;
         }
 
         rev->error = 1;
-        ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSARecv() failed");
+        ngx_connection_error(c, err, "WSARecv() failed");
         return NGX_ERROR;
     }
 
--- a/src/os/win32/ngx_wsasend_chain.c
+++ b/src/os/win32/ngx_wsasend_chain.c
@@ -53,18 +53,19 @@ ngx_chain_t *ngx_wsasend_chain(ngx_conne
         err = ngx_errno;
 
         if (err == WSAEWOULDBLOCK) {
-            ngx_log_error(NGX_LOG_INFO, c->log, err, "WSASend() EAGAIN");
+            ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, err,
+                           "WSASend() not ready");
             wev->ready = 0;
             return in;
 
         } else {
             wev->error = 1;
-            ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSASend() failed");
+            ngx_connection_error(c, err, "WSASend() failed");
             return NGX_CHAIN_ERROR;
         }
     }
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend(): %d", sent);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend: %d", sent);
 
     c->sent += sent;
 
@@ -162,7 +163,7 @@ ngx_chain_t *ngx_overlapped_wsasend_chai
 
             } else {
                 wev->error = 1;
-                ngx_log_error(NGX_LOG_CRIT, c->log, err, "WSASend() failed");
+                ngx_connection_error(c, err, "WSASend() failed");
                 return NGX_CHAIN_ERROR;
             }
  
@@ -187,8 +188,7 @@ ngx_chain_t *ngx_overlapped_wsasend_chai
 
         if (ngx_event_flags & NGX_USE_IOCP_EVENT) {
             if (wev->ovlp.error) {
-                ngx_log_error(NGX_LOG_ERR, c->log, wev->ovlp.error,
-                              "WSASend() failed");
+                ngx_connection_error(c, wev->ovlp.error, "WSASend() failed");
                 return NGX_CHAIN_ERROR;
             }
 
@@ -197,15 +197,15 @@ ngx_chain_t *ngx_overlapped_wsasend_chai
         } else {
             if (WSAGetOverlappedResult(c->fd, (LPWSAOVERLAPPED) &wev->ovlp,
                                        &sent, 0, NULL) == 0) {
-                ngx_log_error(NGX_LOG_CRIT, c->log, ngx_socket_errno,
-                             "WSASend() or WSAGetOverlappedResult() failed");
+                ngx_connection_error(c, ngx_socket_errno,
+                               "WSASend() or WSAGetOverlappedResult() failed");
     
                 return NGX_CHAIN_ERROR;
             }
         }
     }
 
-    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend(): %d", sent);
+    ngx_log_debug1(NGX_LOG_DEBUG_EVENT, c->log, 0, "WSASend: %d", sent);
 
     c->sent += sent;