diff options
Diffstat (limited to 'src/event')
| -rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 65 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.c | 288 | ||||
| -rw-r--r-- | src/event/ngx_event_timer.h | 49 |
3 files changed, 57 insertions, 345 deletions
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index d36160ab1..0ddf4f67e 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -419,23 +419,17 @@ static int ngx_kqueue_process_events(ngx_log_t *log) for (i = 0; i < events; i++) { -#if (NGX_DEBUG_EVENT) - if (event_list[i].ident > 0x8000000 - && event_list[i].ident != (unsigned) -1) - { - ngx_log_debug(log, - "kevent: %08x: ft:%d fl:%08x ff:%08x d:%d ud:%08x" _ - event_list[i].ident _ event_list[i].filter _ - event_list[i].flags _ event_list[i].fflags _ - event_list[i].data _ event_list[i].udata); - } else { - ngx_log_debug(log, - "kevent: %d: ft:%d fl:%08x ff:%08x d:%d ud:%08x" _ - event_list[i].ident _ event_list[i].filter _ - event_list[i].flags _ event_list[i].fflags _ - event_list[i].data _ event_list[i].udata); - } -#endif + ngx_log_debug6(NGX_LOG_DEBUG_EVENT, log, 0, + + (event_list[i].ident > 0x8000000 + && event_list[i].ident != (unsigned) -1) ? + "kevent: " PTR_FMT ": ft:%d fl:%04X ff:%08X d:%d ud:" + PTR_FMT: + "kevent: %d: ft:%d fl:%04X ff:%08X d:%d ud:" PTR_FMT, + + event_list[i].ident, event_list[i].filter, + event_list[i].flags, event_list[i].fflags, + event_list[i].data, event_list[i].udata); if (event_list[i].flags & EV_ERROR) { ngx_log_error(NGX_LOG_ALERT, log, event_list[i].data, @@ -453,13 +447,15 @@ static int ngx_kqueue_process_events(ngx_log_t *log) instance = (uintptr_t) ev & 1; ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); - /* - * it's a stale event from a file descriptor - * that was just closed in this iteration - */ - if (ev->active == 0 || ev->instance != instance) { - ngx_log_debug(log, "stale kevent"); + + /* + * it's a stale event from a file descriptor + * that was just closed in this iteration + */ + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, + "kevent: stale event " PTR_FMT, ev); continue; } @@ -511,6 +507,29 @@ static int ngx_kqueue_process_events(ngx_log_t *log) } +static void ngx_kqueue_thread_handler(ngx_event_t *ev, ngx_log_t *log) +{ + ngx_int_t instance; + + instance = (uintptr_t) ev & 1; + ev = (ngx_event_t *) ((uintptr_t) ev & (uintptr_t) ~1); + + if (ev->active && ev->instance == instance) { + ev->event_handler(ev); + return; + } + + /* + * it's a stale event from a file descriptor + * that was just closed in this iteration + */ + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, log, 0, + "kevent: stale event " PTR_FMT, ev); + +} + + static void *ngx_kqueue_create_conf(ngx_cycle_t *cycle) { ngx_kqueue_conf_t *kcf; diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index c0852e866..4ed9498b3 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -4,6 +4,12 @@ #include <ngx_event.h> +/* + * TODO: in multithreaded enviroment all timer operations must be + * protected by the single mutex + */ + + ngx_rbtree_t *ngx_event_timer_rbtree; ngx_rbtree_t ngx_event_timer_sentinel; @@ -39,7 +45,11 @@ ngx_msec_t ngx_event_find_timer(void) } else { return (ngx_msec_t) + (node->key * NGX_TIMER_RESOLUTION - + ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION); +#if 0 (node->key * NGX_TIMER_RESOLUTION - ngx_elapsed_msec); +#endif } } @@ -82,281 +92,3 @@ void ngx_event_expire_timers(ngx_msec_t timer) break; } } - - -#if 0 - -/* TODO: in multithreaded enviroment all timer operations must be - protected by the single mutex */ - - -#if 0 -static ngx_event_t *ngx_timer_queue, ngx_temp_timer_queue; -static int ngx_expire_timers; -#endif - -static ngx_event_t *ngx_timer_queue; -static ngx_msec_t *ngx_timer_delta; -static int ngx_timer_cur_queue; -static int ngx_timer_queue_num; - - -int ngx_event_timer_init(ngx_cycle_t *cycle) -{ - ngx_int_t i; - ngx_msec_t *new_delta; - ngx_event_t *new_queue; - ngx_event_conf_t *ecf; - - ecf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_core_module); - - if (ngx_timer_queue_num < ecf->timer_queues) { - ngx_test_null(new_queue, - ngx_alloc(ecf->timer_queues * sizeof(ngx_event_t), - cycle->log), - NGX_ERROR); - - for (i = 0; i < ngx_timer_queue_num; i++) { - new_queue[i] = ngx_timer_queue[i]; - } - - if (ngx_timer_queue) { - ngx_free(ngx_timer_queue); - } - - ngx_timer_queue = new_queue; - - ngx_test_null(new_delta, - ngx_calloc(ecf->timer_queues * sizeof(ngx_msec_t), - cycle->log), - NGX_ERROR); - - for (i = 0; i < ngx_timer_queue_num; i++) { - new_delta[i] = ngx_timer_delta[i]; - } - - if (ngx_timer_delta) { - ngx_free(ngx_timer_delta); - } - - ngx_timer_delta = new_delta; - - ngx_timer_queue_num = ecf->timer_queues; - ngx_timer_cur_queue = 0; - - for (/* void */; i < ngx_timer_queue_num; i++) { - ngx_timer_queue[i].timer_prev = &ngx_timer_queue[i]; - ngx_timer_queue[i].timer_next = &ngx_timer_queue[i]; - } - - } else if (ngx_timer_queue_num > ecf->timer_queues) { - /* STUB */ - ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "NOT READY: timer"); - exit(1); - } - -#if 0 - ngx_temp_timer_queue.timer_prev = &ngx_temp_timer_queue; - ngx_temp_timer_queue.timer_next = &ngx_temp_timer_queue; -#endif - - return NGX_OK;; -} - - -void ngx_event_timer_done(ngx_cycle_t *cycle) -{ - ngx_free(ngx_timer_queue); - ngx_timer_queue = NULL; - - ngx_free(ngx_timer_delta); - ngx_timer_delta = NULL; - - ngx_timer_queue_num = 0; -} - - -void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) -{ - ngx_event_t *e, *queue; -#if (NGX_DEBUG_EVENT) - ngx_connection_t *c; -#endif - - if (ev->timer_set) { - ngx_del_timer(ev); - } - -#if (NGX_DEBUG_EVENT) - c = ev->data; - ngx_log_debug(ev->log, "set timer: %d:%d:%d, slot: %d" _ - c->fd _ ev->write _ timer _ ngx_timer_cur_queue); -#endif - - if (ev->timer_next || ev->timer_prev) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already set"); - return; - } - - queue = &ngx_timer_queue[ngx_timer_cur_queue]; - timer += ngx_timer_delta[ngx_timer_cur_queue++]; - - if (ngx_timer_cur_queue >= ngx_timer_queue_num) { - ngx_timer_cur_queue = 0; - } - - -#if 0 - if (ngx_expire_timers) { - queue = &ngx_temp_timer_queue; - - } else { - queue = &ngx_timer_queue[ngx_timer_cur_queue++]; - - if (ngx_timer_cur_queue >= ngx_timer_queue_num) { - ngx_timer_cur_queue = 0; - } - } -#endif - - for (e = queue->timer_next; - e != queue && timer > e->timer_delta; - e = e->timer_next) - { - timer -= e->timer_delta; - } - - ev->timer_delta = timer; - - ev->timer_next = e; - ev->timer_prev = e->timer_prev; - - e->timer_prev->timer_next = ev; - e->timer_prev = ev; - - ev->timer_set = 1; - - return; -} - - -int ngx_event_find_timer(void) -{ - ngx_int_t i; - ngx_msec_t timer; - - timer = NGX_MAX_MSEC; - - for (i = 0; i < ngx_timer_queue_num; i++) { - if (ngx_timer_queue[i].timer_next == &ngx_timer_queue[i]) { - continue; - } - - if (timer > ngx_timer_queue[i].timer_next->timer_delta) { - timer = ngx_timer_queue[i].timer_next->timer_delta; - } - } - - if (timer == NGX_MAX_MSEC) { - return 0; - } - - return timer; -} - - -void ngx_event_set_timer_delta(ngx_msec_t timer) -{ - ngx_int_t i; - - for (i = 0; i < ngx_timer_queue_num; i++) { - ngx_timer_delta[i] = timer; - } -} - - -/* void ngx_event_expire_timers() */ -void ngx_event_expire_timers(ngx_msec_t timer) -{ - ngx_int_t i; -#if 0 - ngx_msec_t delta; -#endif - ngx_event_t *ev; - -#if 0 - ngx_expire_timers = 1; -#endif - - for (i = 0; i < ngx_timer_queue_num; i++) { - -#if 0 - delta = timer; -#endif - - for ( ;; ) { - ev = ngx_timer_queue[i].timer_next; - - if (ev == &ngx_timer_queue[i]) { - break; - } - - if (ev->timer_delta > ngx_timer_delta[i]) { - ev->timer_delta -= ngx_timer_delta[i]; - break; - } - - ngx_timer_delta[i] -= ev->timer_delta; - -#if 0 - if (ev->timer_delta > delta) { - ev->timer_delta -= delta; - break; - } - - delta -= ev->timer_delta; -#endif - - ngx_del_timer(ev); - - if (ev->delayed) { - ev->delayed = 0; - if (ev->ready == 0) { - continue; - } - - } else { - ev->timedout = 1; - } - - ev->event_handler(ev); - } - - ngx_timer_delta[i] = 0; - } - -#if 0 - ngx_expire_timers = 0; - - if (ngx_temp_timer_queue.timer_next == &ngx_temp_timer_queue) { - return; - } - - timer = 0; - - while (ngx_temp_timer_queue.timer_next != &ngx_temp_timer_queue) { - timer += ngx_temp_timer_queue.timer_next->timer_delta; - ev = ngx_temp_timer_queue.timer_next; - -#if (NGX_DEBUG_EVENT) - ngx_log_debug(ev->log, "process temp timer queue"); -#endif - - ngx_del_timer(ev); - ngx_add_timer(ev, timer); - } -#endif -} - - -#endif diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index 21867ce20..51e3229c9 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -8,7 +8,7 @@ /* - * 32 bit key value resolution + * 32 bit timer key value resolution * * 1 msec - 49 days * 10 msec - 1 years 4 months @@ -28,15 +28,6 @@ int ngx_event_timer_init(void); ngx_msec_t 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; extern ngx_rbtree_t ngx_event_timer_sentinel; @@ -59,7 +50,11 @@ ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) } ev->rbtree_key = (ngx_int_t) + (ngx_elapsed_msec / NGX_TIMER_RESOLUTION * NGX_TIMER_RESOLUTION + + timer) / NGX_TIMER_RESOLUTION; +#if 0 (ngx_elapsed_msec + timer) / NGX_TIMER_RESOLUTION; +#endif ngx_rbtree_insert(&ngx_event_timer_rbtree, &ngx_event_timer_sentinel, (ngx_rbtree_t *) &ev->rbtree_key); @@ -68,38 +63,4 @@ ngx_inline static void ngx_event_add_timer(ngx_event_t *ev, ngx_msec_t timer) } -#if 0 - -ngx_inline static void ngx_event_del_timer(ngx_event_t *ev) -{ -#if (NGX_DEBUG_EVENT) - ngx_connection_t *c = ev->data; - ngx_log_debug(ev->log, "del timer: %d:%d" _ c->fd _ ev->write); -#endif - - if (!ev->timer_next || !ev->timer_prev) { - ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "timer already deleted"); - return; - } - - if (ev->timer_prev) { - ev->timer_prev->timer_next = ev->timer_next; - } - - if (ev->timer_next) { - ev->timer_next->timer_delta += ev->timer_delta; - ev->timer_next->timer_prev = ev->timer_prev; - ev->timer_next = NULL; - } - - if (ev->timer_prev) { - ev->timer_prev = NULL; - } - - ev->timer_set = 0; -} - -#endif - - #endif /* _NGX_EVENT_TIMER_H_INCLUDED_ */ |
