diff options
| author | Igor Sysoev <igor@sysoev.ru> | 2003-12-04 14:53:00 +0000 |
|---|---|---|
| committer | Igor Sysoev <igor@sysoev.ru> | 2003-12-04 14:53:00 +0000 |
| commit | f5003d8a66790932cae5168a913ae234cd4ce709 (patch) | |
| tree | 9f252372fa7b1bb6673394aaecce911e10605593 /src/event | |
| parent | 7adb8c0e8fa58c51dfaf2a563b2216e7d678435c (diff) | |
| download | nginx-f5003d8a66790932cae5168a913ae234cd4ce709.tar.gz nginx-f5003d8a66790932cae5168a913ae234cd4ce709.tar.bz2 | |
nginx-0.0.1-2003-12-04-17:53:00 import
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 25 | ||||
| -rw-r--r-- | src/event/ngx_event.c | 11 | ||||
| -rw-r--r-- | src/event/ngx_event.h | 5 | ||||
| -rw-r--r-- | src/event/ngx_event_accept.c | 3 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.c | 78 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.h | 46 |
6 files changed, 149 insertions, 19 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 9371ecee1..393c4d1ef 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -360,8 +360,10 @@ static int ngx_kqueue_process_events(ngx_log_t *log) ts.tv_nsec = (timer % 1000) * 1000000; tp = &ts; +#if 0 ngx_gettimeofday(&tv); delta = tv.tv_sec * 1000 + tv.tv_usec / 1000; +#endif } else { delta = 0; @@ -384,28 +386,31 @@ static int ngx_kqueue_process_events(ngx_log_t *log) ngx_gettimeofday(&tv); +#if 1 + delta = ngx_elapsed_msec; +#endif + ngx_elapsed_msec = tv.tv_sec * 1000 + tv.tv_usec / 1000 - ngx_start_msec; + if (ngx_cached_time != tv.tv_sec) { ngx_cached_time = tv.tv_sec; ngx_time_update(); } if (timer) { - delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; - -#if (NGX_DEBUG_EVENT) - ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); -#endif + delta = ngx_elapsed_msec - delta; #if 0 + delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta; + /* * The expired timers must be handled before a processing of the events * because the new timers can be added during a processing */ ngx_event_expire_timers((ngx_msec_t) delta); -#endif ngx_event_set_timer_delta((ngx_msec_t) delta); +#endif } else { if (events == 0) { @@ -413,11 +418,11 @@ static int ngx_kqueue_process_events(ngx_log_t *log) "kevent() returned no events without timeout"); return NGX_ERROR; } + } #if (NGX_DEBUG_EVENT) ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta); #endif - } if (err) { ngx_log_error(NGX_LOG_ALERT, log, err, "kevent() failed"); @@ -510,9 +515,15 @@ static int ngx_kqueue_process_events(ngx_log_t *log) } } + if (timer && delta) { + ngx_event_expire_timers((ngx_msec_t) delta); + } + +#if 0 if (timer) { ngx_event_expire_timers((ngx_msec_t) delta); } +#endif return NGX_OK; } diff --git a/src/event/ngx_event.c b/src/event/ngx_event.c index 71bf45d16..8a0856d86 100644 --- a/src/event/ngx_event.c +++ b/src/event/ngx_event.c @@ -200,21 +200,10 @@ ngx_log_debug(cycle->log, "TYPE: %d" _ ecf->use); /* required by iocp in "c->write->active = 1" */ c->write = wev; -#if 0 - ngx_test_null(rev->log, ngx_palloc(cycle->pool, sizeof(ngx_log_t)), - NGX_ERROR); - - ngx_memcpy(rev->log, c->log, sizeof(ngx_log_t)); -#endif - rev->log = c->log; rev->data = c; rev->index = NGX_INVALID_INDEX; -#if 0 - rev->listening = 1; -#endif - rev->available = 0; #if (HAVE_DEFERRED_ACCEPT) diff --git a/src/event/ngx_event.h b/src/event/ngx_event.h index 8e4ce4484..1454cdb7c 100644 --- a/src/event/ngx_event.h +++ b/src/event/ngx_event.h @@ -31,11 +31,14 @@ struct ngx_event_s { ngx_event_t *prev; ngx_event_t *next; + ngx_rbtree_t rbtree; + +#if 0 ngx_event_t *timer_prev; ngx_event_t *timer_next; ngx_msec_t timer_delta; - ngx_msec_t timer; +#endif ngx_log_t *log; diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index ea63724e9..bba5aa55f 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -175,6 +175,9 @@ void ngx_event_accept(ngx_event_t *ev) rev->index = NGX_INVALID_INDEX; wev->index = NGX_INVALID_INDEX; + rev->rbtree.data = rev; + wev->rbtree.data = wev; + rev->data = c; wev->data = c; diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index 8176ed1c4..296c748ee 100644 --- 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 timer) } #endif } + + +#endif diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index 911667d14..ea8105ee3 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -7,15 +7,59 @@ #include <ngx_event.h> +/* + * 1 msec - 49 days + * 10 msec - 1 years 4 months + * 50 msec - 6 years 10 months + * 100 msec - 13 years 8 months + */ + +#define NGX_TIMER_RESOLUTION 50 + + +int ngx_event_timer_init(ngx_cycle_t *cycle); +void ngx_event_timer_done(ngx_cycle_t *cycle); +int ngx_event_find_timer(void); +void ngx_event_expire_timers(ngx_msec_t timer); + +#if 0 int ngx_event_timer_init(ngx_cycle_t *cycle); void ngx_event_timer_done(ngx_cycle_t *cycle); void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer); int ngx_event_find_timer(void); void ngx_event_set_timer_delta(ngx_msec_t timer); void ngx_event_expire_timers(ngx_msec_t timer); +#endif + + +extern ngx_rbtree_t *ngx_event_timer_rbtree; + + +ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) +{ + ngx_rbtree_delete(&ngx_event_timer_rbtree, &ev->rbtree); + + ev->timer_set = 0; +} + + +ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) +{ + if (ev->timer_set) { + ngx_del_timer(ev); + } + + ev->rbtree.key = (ngx_int_t) + (ngx_elapsed_msec + timer) / NGX_TIMER_RESOLUTION; + ngx_rbtree_insert(&ngx_event_timer_rbtree, &ev->rbtree); + + ev->timer_set = 1; +} +#if 0 + ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) { #if (NGX_DEBUG_EVENT) @@ -45,5 +89,7 @@ ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) ev->timer_set = 0; } +#endif + #endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */ |
