Mercurial > hg > nginx
diff src/event/ngx_event_timer.c @ 559:c1f965ef9718 release-0.3.1
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.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 10 Oct 2005 12:59:41 +0000 |
parents | ecd9c160f25b |
children | e48ebafc6939 |
line wrap: on
line diff
--- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -14,27 +14,28 @@ ngx_mutex_t *ngx_event_timer_mutex; #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_event_timer_init(ngx_log_t *log) 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 @@ ngx_event_find_timer(void) 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_event_expire_timers(void) - (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_event_expire_timers(void) 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;