diff src/event/ngx_event_timer.c @ 270:7bb9562216ce

nginx-0.0.2-2004-02-25-23:16:15 import
author Igor Sysoev <igor@sysoev.ru>
date Wed, 25 Feb 2004 20:16:15 +0000
parents 5238e93961a1
children d4e65d74db9f
line wrap: on
line diff
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -4,13 +4,8 @@
 #include <ngx_event.h>
 
 
-/*
- * TODO: in multithreaded enviroment all timer operations must be
- * protected by the single mutex
- */
-
 #if (NGX_THREADS)
-static ngx_mutex_t  *ngx_event_timer_mutex;
+ngx_mutex_t  *ngx_event_timer_mutex;
 #endif
 
 
@@ -18,13 +13,20 @@ ngx_rbtree_t  *ngx_event_timer_rbtree;
 ngx_rbtree_t   ngx_event_timer_sentinel;
 
 
-void ngx_event_timer_init(void)
+ngx_int_t ngx_event_timer_init(ngx_log_t *log)
 {
     if (ngx_event_timer_rbtree) {
-        return;
+        ngx_event_timer_mutex->log = log;
+        return NGX_OK;
     }
 
     ngx_event_timer_rbtree = &ngx_event_timer_sentinel;
+
+    if (!(ngx_event_timer_mutex = ngx_mutex_init(log, 0))) {
+        return NGX_ERROR;
+    }
+
+    return NGX_OK;
 }
 
 
@@ -36,8 +38,18 @@ ngx_msec_t ngx_event_find_timer(void)
         return 0;
     }
 
+#if (NGX_THREADS)
+    if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
+        return NGX_TIMER_ERROR;
+    }
+#endif
+
     node = ngx_rbtree_min(ngx_event_timer_rbtree, &ngx_event_timer_sentinel);
 
+#if (NGX_THREADS)
+    ngx_mutex_unlock(ngx_event_timer_mutex);
+#endif
+
     return (ngx_msec_t)
          (node->key * NGX_TIMER_RESOLUTION -
                ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION);
@@ -58,9 +70,19 @@ void ngx_event_expire_timers(ngx_msec_t 
             break;
         }
 
+#if (NGX_THREADS)
+        if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
+            return;
+        }
+#endif
+
         node = ngx_rbtree_min(ngx_event_timer_rbtree,
                               &ngx_event_timer_sentinel);
 
+#if (NGX_THREADS)
+        ngx_mutex_unlock(ngx_event_timer_mutex);
+#endif
+
         if ((ngx_msec_t) node->key <= (ngx_msec_t)
                          (ngx_old_elapsed_msec + timer) / NGX_TIMER_RESOLUTION)
         {
@@ -79,6 +101,10 @@ void ngx_event_expire_timers(ngx_msec_t 
                 ev->timedout = 1;
             }
 
+#if (NGX_THREADS)
+            /* STUB: post event */
+#endif
+
             ev->event_handler(ev);
             continue;
         }