Mercurial > hg > nginx
diff src/event/ngx_event_timer.c @ 205:4a9a2b1dd6fa
nginx-0.0.1-2003-12-04-17:53:00 import
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 04 Dec 2003 14:53:00 +0000 |
parents | 8dee38ea9117 |
children | 9aa426375256 |
line wrap: on
line diff
--- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -4,6 +4,81 @@ #include <ngx_event.h> +ngx_rbtree_t *ngx_event_timer_rbtree; + + +int ngx_event_timer_init(ngx_cycle_t *cycle) +{ + ngx_event_timer_rbtree = &sentinel; + sentinel.left = &sentinel; + sentinel.right = &sentinel; + sentinel.parent = &sentinel; + + return NGX_OK; +} + + +void ngx_event_timer_done(ngx_cycle_t *cycle) +{ +} + + +int ngx_event_find_timer(void) +{ + ngx_rbtree_t *node; + + node = ngx_rbtree_min(ngx_event_timer_rbtree); + + if (node == &sentinel) { + return 0; + + } else { + return node->key * NGX_TIMER_RESOLUTION - ngx_elapsed_msec; + } +} + + +void ngx_event_expire_timers(ngx_msec_t timer) +{ + ngx_event_t *ev; + ngx_rbtree_t *node; + + for ( ;; ) { + node = ngx_rbtree_min(ngx_event_timer_rbtree); + + if (node == &sentinel) { + break; + } + + if ((ngx_msec_t) node->key <= + (ngx_elapsed_msec + timer) / NGX_TIMER_RESOLUTION) + { + ev = (ngx_event_t *) + ((char *) node - offsetof(ngx_event_t, rbtree)); + + ngx_del_timer(ev); + + if (ev->delayed) { + ev->delayed = 0; + if (ev->ready == 0) { + continue; + } + + } else { + ev->timedout = 1; + } + + ev->event_handler(ev); + continue; + } + + break; + } +} + + +#if 0 + /* TODO: in multithreaded enviroment all timer operations must be protected by the single mutex */ @@ -275,3 +350,6 @@ void ngx_event_expire_timers(ngx_msec_t } #endif } + + +#endif