Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nginx/nginx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Sysoev <igor@sysoev.ru>2004-02-25 23:16:15 +0300
committerIgor Sysoev <igor@sysoev.ru>2004-02-25 23:16:15 +0300
commitf2334416e7485ff1c260a46ba47aeadffeff923a (patch)
treed4d562a3c0c4af27ed23e9602cad653f1d4fec00 /src/event/ngx_event_timer.c
parent14dab4563898155799a06007fff9c30c4dac8b26 (diff)
nginx-0.0.2-2004-02-25-23:16:15 import
Diffstat (limited to 'src/event/ngx_event_timer.c')
-rw-r--r--src/event/ngx_event_timer.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index e002cb7eb..498fd9fa0 100644
--- 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 timer)
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 timer)
ev->timedout = 1;
}
+#if (NGX_THREADS)
+ /* STUB: post event */
+#endif
+
ev->event_handler(ev);
continue;
}