nginx-0.0.1-2003-11-11-21:13:43 import
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index 9bc7434..c8f3684 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -322,9 +322,10 @@
 int ngx_devpoll_process_events(ngx_log_t *log)
 {
     int                 events, n, i, j;
-    ngx_msec_t          timer, delta;
+    ngx_msec_t          timer;
     ngx_err_t           err;
     ngx_cycle_t       **cycle;
+    ngx_epoch_msec_t   delta;
     ngx_connection_t   *c;
     struct dvpoll       dvp;
     struct timeval      tv;
@@ -332,7 +333,7 @@
     timer = ngx_event_find_timer();
 
     if (timer) {
-        gettimeofday(&tv, NULL);
+        ngx_gettimeofday(&tv);
         delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
 
     } else {
@@ -366,7 +367,7 @@
 
     nchanges = 0;
 
-    gettimeofday(&tv, NULL);
+    ngx_gettimeofday(&tv);
 
     if (ngx_cached_time != tv.tv_sec) {
         ngx_cached_time = tv.tv_sec;
@@ -377,9 +378,9 @@
         delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta);
 #endif
-        ngx_event_expire_timers(delta);
+        ngx_event_expire_timers((ngx_msec_t) delta);
 
     } else {
         if (events == 0) {
@@ -389,7 +390,7 @@
         }
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta);
 #endif
     }
 
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index 0a5ac5b..99a1eee 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -162,14 +162,16 @@
     u_int              key;
     size_t             bytes;
     ngx_err_t          err;
-    ngx_msec_t         timer, delta;
+    ngx_msec_t         timer;
     ngx_event_t       *ev;
+    ngx_epoch_msec_t   delta;
     ngx_event_ovlp_t  *ovlp;
 
     timer = ngx_event_find_timer();
 
     if (timer) {
-        delta = ngx_msec();
+        ngx_gettimeofday(&tv);
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
 
     } else {
         timer = INFINITE;
@@ -189,11 +191,16 @@
         err = 0;
     }
 
-    /* TODO: timer */
+    ngx_gettimeofday(&tv);
+
+    if (ngx_cached_time != tv.tv_sec) {
+        ngx_cached_time = tv.tv_sec;
+        ngx_time_update();
+    }
 
     if (timer != INFINITE) {
-        delta = ngx_msec() - delta;
-        ngx_event_expire_timers(delta);
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
+        ngx_event_expire_timers((ngx_msec_t) delta);
     }
 
     if (err) {
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 831bc77..d43fb0e 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -311,12 +311,13 @@
 
 static int ngx_kqueue_process_events(ngx_log_t *log)
 {
-    int              events, instance, i;
-    ngx_err_t        err;
-    ngx_msec_t       timer, delta;
-    ngx_event_t      *ev;
-    struct timeval   tv;
-    struct timespec  ts, *tp;
+    int                events, instance, i;
+    ngx_err_t          err;
+    ngx_msec_t         timer;
+    ngx_event_t       *ev;
+    ngx_epoch_msec_t   delta;
+    struct timeval     tv;
+    struct timespec    ts, *tp;
 
     timer = ngx_event_find_timer();
 
@@ -324,11 +325,11 @@
         ts.tv_sec = timer / 1000;
         ts.tv_nsec = (timer % 1000) * 1000000;
         tp = &ts;
-        gettimeofday(&tv, NULL);
+
+        ngx_gettimeofday(&tv);
         delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
 
     } else {
-        timer = 0;
         delta = 0;
         tp = NULL;
     }
@@ -347,7 +348,7 @@
 
     nchanges = 0;
 
-    gettimeofday(&tv, NULL);
+    ngx_gettimeofday(&tv);
 
     if (ngx_cached_time != tv.tv_sec) {
         ngx_cached_time = tv.tv_sec;
@@ -358,7 +359,7 @@
         delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
 
         /*
@@ -366,7 +367,7 @@
          * because the new timers can be added during a processing
          */
 
-        ngx_event_expire_timers(delta);
+        ngx_event_expire_timers((ngx_msec_t) delta);
 
     } else {
         if (events == 0) {
@@ -376,7 +377,7 @@
         }
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
     }
 
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index 34f2b11..e771e92 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -224,16 +224,19 @@
 {
     int                 ready, found, j;
     u_int               nready, i;
-    ngx_msec_t          timer, delta;
+    ngx_msec_t          timer;
     ngx_err_t           err;
     ngx_cycle_t       **cycle;
     ngx_event_t        *ev;
+    ngx_epoch_msec_t   delta;
     ngx_connection_t   *c;
+    struct timeval     tv;
 
     timer = ngx_event_find_timer();
 
     if (timer) {
-        delta = ngx_msec();
+        ngx_gettimeofday(&tv);
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
 
     } else {
         timer = INFTIM;
@@ -259,15 +262,20 @@
 
     ngx_log_debug(log, "poll ready %d" _ ready);
 
-    /* TODO: time */
+    ngx_gettimeofday(&tv);
+
+    if (ngx_cached_time != tv.tv_sec) {
+        ngx_cached_time = tv.tv_sec;
+        ngx_time_update();
+    }
 
     if ((int) timer != INFTIM) {
-        delta = ngx_msec() - delta;
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
-        ngx_event_expire_timers(delta);
+        ngx_event_expire_timers((ngx_msec_t) delta);
 
     } else {
         if (ready == 0) {
@@ -277,7 +285,7 @@
         }
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
     }
 
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 082c0e3..1cde073 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -148,6 +148,7 @@
     }
 
 #if (WIN32)
+
     if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE)
         || (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE))
     {
@@ -165,7 +166,9 @@
         FD_SET(c->fd, &master_write_fd_set);
         max_write++;
     }
+
 #else
+
     if (event == NGX_READ_EVENT) {
         FD_SET(c->fd, &master_read_fd_set);
 
@@ -247,10 +250,14 @@
     int                ready, found;
     u_int              i, nready;
     ngx_err_t          err;
-    ngx_msec_t         timer, delta;
+    ngx_msec_t         timer;
     ngx_event_t       *ev;
     ngx_connection_t  *c;
+    ngx_epoch_msec_t   delta;
     struct timeval     tv, *tp;
+#if (HAVE_SELECT_CHANGE_TIMEOUT)
+    static ngx_epoch_msec_t  deltas = 0;
+#endif
 
     work_read_fd_set = master_read_fd_set;
     work_write_fd_set = master_write_fd_set;
@@ -264,7 +271,8 @@
 #if (HAVE_SELECT_CHANGE_TIMEOUT)
         delta = 0;
 #else
-        delta = ngx_msec();
+        ngx_gettimeofday(&tv);
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
 #endif
 
     } else {
@@ -314,32 +322,69 @@
     ngx_log_debug(log, "select ready %d" _ ready);
 #endif
 
-    /* TODO: time */
+#if (HAVE_SELECT_CHANGE_TIMEOUT)
 
     if (timer) {
-#if (HAVE_SELECT_CHANGE_TIMEOUT)
         delta = timer - (tv.tv_sec * 1000 + tv.tv_usec / 1000);
 
-#if 0
         /*
-         * update the cached time if the sum of the last deltas
-         * is more than 0.5 seconds
+         * learn the real time and update the cached time
+         * if the sum of the last deltas overcomes 1 second
          */
-        deltas += delta;
-        if (deltas > 500000) {
-            ngx_cached_time = ngx_real_time();
-            deltas = 0;
-        }
-#endif
 
-#else
-        delta = ngx_msec() - delta;
-#endif
+        deltas += delta;
+        if (deltas > 1000) {
+            ngx_gettimeofday(&tv);
+            deltas = tv.tv_usec / 1000;
+
+            if (ngx_cached_time != tv.tv_sec) {
+                ngx_cached_time = tv.tv_sec;
+                ngx_time_update();
+            }
+        }
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
-        ngx_event_expire_timers(delta);
+
+        ngx_event_expire_timers((ngx_msec_t) delta);
+
+    } else {
+        ngx_gettimeofday(&tv);
+
+        if (ngx_cached_time != tv.tv_sec) {
+            ngx_cached_time = tv.tv_sec;
+            ngx_time_update();
+        }
+
+        if (ready == 0) {
+            ngx_log_error(NGX_LOG_ALERT, log, 0,
+                          "select() returned no events without timeout");
+            return NGX_ERROR;
+        }
+
+#if (NGX_DEBUG_EVENT)
+        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
+#endif
+    }
+
+#else /* HAVE_SELECT_CHANGE_TIMEOUT */
+
+    ngx_gettimeofday(&tv);
+
+    if (ngx_cached_time != tv.tv_sec) {
+        ngx_cached_time = tv.tv_sec;
+        ngx_time_update();
+    }
+
+    if (timer) {
+        delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
+
+#if (NGX_DEBUG_EVENT)
+        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
+#endif
+
+        ngx_event_expire_timers((ngx_msec_t) delta);
 
     } else {
         if (ready == 0) {
@@ -349,11 +394,12 @@
         }
 
 #if (NGX_DEBUG_EVENT)
-        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+        ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
 #endif
-        ngx_event_expire_timers(delta);
     }
 
+#endif /* HAVE_SELECT_CHANGE_TIMEOUT */
+
     if (err) {
         ngx_log_error(NGX_LOG_ALERT, log, err, "select() failed");
         return NGX_ERROR;