nginx-0.3.1-RELEASE import
*) Bugfix: the segmentation fault occurred when the signal queue
overflowed if the "rtsig" method was used; the bug had appeared in
0.2.0.
*) Change: correct handling of the "\\", "\"", "\'", and "\$" pairs in
SSI.
diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c
index c3d3c7e..656f62b 100644
--- a/src/event/ngx_event_timer.c
+++ b/src/event/ngx_event_timer.c
@@ -14,27 +14,28 @@
#endif
-ngx_thread_volatile ngx_rbtree_t *ngx_event_timer_rbtree;
-ngx_rbtree_t ngx_event_timer_sentinel;
+ngx_thread_volatile ngx_rbtree_t ngx_event_timer_rbtree;
+static ngx_rbtree_node_t ngx_event_timer_sentinel;
ngx_int_t
ngx_event_timer_init(ngx_log_t *log)
{
- if (ngx_event_timer_rbtree) {
+ ngx_event_timer_rbtree.root = &ngx_event_timer_sentinel;
+ ngx_event_timer_rbtree.sentinel = &ngx_event_timer_sentinel;
+
#if (NGX_THREADS)
+
+ if (ngx_event_timer_mutex) {
ngx_event_timer_mutex->log = log;
-#endif
return NGX_OK;
}
- ngx_event_timer_rbtree = &ngx_event_timer_sentinel;
-
-#if (NGX_THREADS)
ngx_event_timer_mutex = ngx_mutex_init(log, 0);
if (ngx_event_timer_mutex == NULL) {
return NGX_ERROR;
}
+
#endif
return NGX_OK;
@@ -44,10 +45,10 @@
ngx_msec_t
ngx_event_find_timer(void)
{
- ngx_msec_t timer;
- ngx_rbtree_t *node;
+ ngx_rbtree_key_int_t timer;
+ ngx_rbtree_node_t *node, *root, *sentinel;
- if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
+ if (ngx_event_timer_rbtree.root == &ngx_event_timer_sentinel) {
return NGX_TIMER_INFINITE;
}
@@ -55,35 +56,41 @@
return NGX_TIMER_ERROR;
}
- node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
- &ngx_event_timer_sentinel);
+ root = ngx_event_timer_rbtree.root;
+ sentinel = ngx_event_timer_rbtree.sentinel;
+
+ node = ngx_rbtree_min(root, sentinel);
ngx_mutex_unlock(ngx_event_timer_mutex);
- timer = (ngx_msec_t) node->key - ngx_current_time;
+ timer = (ngx_rbtree_key_int_t) node->key
+ - (ngx_rbtree_key_int_t) ngx_current_time;
- return timer > 0 ? timer : 0 ;
+ return (ngx_msec_t) (timer > 0 ? timer : 0);
}
void
ngx_event_expire_timers(void)
{
- ngx_event_t *ev;
- ngx_rbtree_t *node;
+ ngx_event_t *ev;
+ ngx_rbtree_node_t *node, *root, *sentinel;
+
+ sentinel = ngx_event_timer_rbtree.sentinel;
for ( ;; ) {
- if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) {
- return;
- }
-
if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) {
return;
}
- node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree,
- &ngx_event_timer_sentinel);
+ root = ngx_event_timer_rbtree.root;
+
+ if (root == sentinel) {
+ return;
+ }
+
+ node = ngx_rbtree_min(root, sentinel);
/* node->key <= ngx_current_time */
@@ -91,8 +98,7 @@
- (ngx_rbtree_key_int_t) ngx_current_time
<= 0)
{
- ev = (ngx_event_t *)
- ((char *) node - offsetof(ngx_event_t, rbtree_key));
+ ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, timer));
#if (NGX_THREADS)
@@ -114,18 +120,16 @@
ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0,
"event timer del: %d: %M",
- ngx_event_ident(ev->data), ev->rbtree_key);
+ ngx_event_ident(ev->data), ev->timer.key);
- ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree,
- &ngx_event_timer_sentinel,
- (ngx_rbtree_t *) &ev->rbtree_key);
+ ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->timer);
ngx_mutex_unlock(ngx_event_timer_mutex);
#if (NGX_DEBUG)
- ev->rbtree_left = NULL;
- ev->rbtree_right = NULL;
- ev->rbtree_parent = NULL;
+ ev->timer.left = NULL;
+ ev->timer.right = NULL;
+ ev->timer.parent = NULL;
#endif
ev->timer_set = 0;