Mercurial > hg > nginx
diff src/event/ngx_event_timer.c @ 371:780e93985b93
nginx-0.0.7-2004-06-28-20:05:02 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 28 Jun 2004 16:05:02 +0000 |
parents | 446782c909b3 |
children | c9fdfccebc49 |
line wrap: on
line diff
--- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -71,7 +71,7 @@ void ngx_event_expire_timers(ngx_msec_t for ( ;; ) { if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) { - break; + return; } if (ngx_mutex_lock(ngx_event_timer_mutex) == NGX_ERROR) { @@ -81,17 +81,35 @@ void ngx_event_expire_timers(ngx_msec_t node = ngx_rbtree_min((ngx_rbtree_t *) ngx_event_timer_rbtree, &ngx_event_timer_sentinel); - ngx_mutex_unlock(ngx_event_timer_mutex); - if (node->key <= (ngx_msec_t) (ngx_old_elapsed_msec + timer) / NGX_TIMER_RESOLUTION) { ev = (ngx_event_t *) ((char *) node - offsetof(ngx_event_t, rbtree_key)); - ngx_del_timer(ev); + if (ngx_trylock(ev->lock) == 0) { + break; + } + + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, ev->log, 0, + "event timer del: %d: %d", + ngx_event_ident(ev->data), ev->rbtree_key); + + ngx_rbtree_delete((ngx_rbtree_t **) &ngx_event_timer_rbtree, + &ngx_event_timer_sentinel, + (ngx_rbtree_t *) &ev->rbtree_key); + ngx_mutex_unlock(ngx_event_timer_mutex); + +#if (NGX_DEBUG) + ev->rbtree_left = NULL; + ev->rbtree_right = NULL; + ev->rbtree_parent = NULL; +#endif + + ev->timer_set = 0; ev->timedout = 1; + ngx_unlock(ev->lock); if (ngx_threaded) { if (ngx_mutex_lock(ngx_posted_events_mutex) == NGX_ERROR) { @@ -107,7 +125,8 @@ void ngx_event_expire_timers(ngx_msec_t ev->event_handler(ev); continue; } - break; } + + ngx_mutex_unlock(ngx_event_timer_mutex); }