diff options
Diffstat (limited to 'src/event')
-rw-r--r-- | src/event/modules/ngx_epoll_module.c | 10 | ||||
-rw-r--r-- | src/event/modules/ngx_kqueue_module.c | 7 | ||||
-rw-r--r-- | src/event/modules/ngx_poll_module.c | 18 | ||||
-rw-r--r-- | src/event/modules/ngx_select_module.c | 74 | ||||
-rw-r--r-- | src/event/ngx_event_accept.c | 8 | ||||
-rw-r--r-- | src/event/ngx_event_posted.c | 3 | ||||
-rw-r--r-- | src/event/ngx_event_timer.c | 5 | ||||
-rw-r--r-- | src/event/ngx_event_timer.h | 8 |
8 files changed, 88 insertions, 45 deletions
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c index 4b76f86cf..cad7ed9b7 100644 --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c @@ -356,7 +356,11 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle) timer = ngx_event_find_timer(); ngx_old_elapsed_msec = ngx_elapsed_msec; - if (timer == 0) { + if (timer == -1) { + timer = 0; + expire = 1; + + } else if (timer == 0) { timer = (ngx_msec_t) -1; expire = 0; @@ -369,7 +373,9 @@ int ngx_epoll_process_events(ngx_cycle_t *cycle) return NGX_ERROR; } - if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { + if (ngx_accept_mutex_held == 0 + && (timer == -1 || timer > ngx_accept_mutex_delay)) + { timer = ngx_accept_mutex_delay; expire = 0; } diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index 454d7dbb5..bf37bf5b4 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c @@ -383,7 +383,12 @@ static ngx_int_t ngx_kqueue_process_events(ngx_cycle_t *cycle) } } - if (timer) { + if (timer == -1) { + ts.tv_sec = 0; + ts.tv_nsec = 0; + tp = &ts; + + } else if (timer) { ts.tv_sec = timer / 1000; ts.tv_nsec = (timer % 1000) * 1000000; tp = &ts; diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index dd98eca25..ffe59d49f 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c @@ -125,6 +125,8 @@ static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) c = ev->data; + ev->active = 1; + if (ev->index != NGX_INVALID_INDEX) { ngx_log_error(NGX_LOG_ALERT, ev->log, 0, "poll event fd:%d ev:%d is already set", c->fd, event); @@ -163,7 +165,6 @@ static int ngx_poll_add_event(ngx_event_t *ev, int event, u_int flags) ev->index = e->index; } - ev->active = 1; ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0; return NGX_OK; @@ -278,7 +279,11 @@ int ngx_poll_process_events(ngx_cycle_t *cycle) } else { timer = ngx_event_find_timer(); - if (timer == 0) { + if (timer == -1) { + timer = 0; + expire = 1; + + } else if (timer == 0) { timer = (ngx_msec_t) INFTIM; expire = 0; @@ -302,7 +307,9 @@ int ngx_poll_process_events(ngx_cycle_t *cycle) return NGX_ERROR; } - if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { + if (ngx_accept_mutex_held == 0 + && (timer == (ngx_msec_t) INFTIM || timer > ngx_accept_mutex_delay)) + { timer = ngx_accept_mutex_delay; expire = 0; } @@ -348,8 +355,11 @@ int ngx_poll_process_events(ngx_cycle_t *cycle) } } - if (timer == 0 && ready == 0) { + if ((ngx_event_flags & NGX_OVERFLOW_EVENT) && timer == 0 && ready == 0) { + /* the overflowed rt signals queue has been drained */ + + ngx_accept_mutex_unlock(); return NGX_OK; } diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 596ee6a35..0f3848d4e 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c @@ -263,33 +263,25 @@ static int ngx_select_process_events(ngx_cycle_t *cycle) static ngx_epoch_msec_t deltas = 0; #endif - work_read_fd_set = master_read_fd_set; - work_write_fd_set = master_write_fd_set; - timer = ngx_event_find_timer(); ngx_old_elapsed_msec = ngx_elapsed_msec; - if (timer) { - tv.tv_sec = timer / 1000; - tv.tv_usec = (timer % 1000) * 1000; - tp = &tv; - expire = 1; + expire = 1; - } else { - tp = NULL; - expire = 0; - } +#if !(WIN32) -#if (NGX_DEBUG) - for (i = 0; i < nevents; i++) { - ev = event_index[i]; - c = ev->data; - ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "select event: fd:%d wr:%d", c->fd,ev->write); - } -#endif + if (ngx_accept_mutex) { + if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { + return NGX_ERROR; + } -#if !(WIN32) + if (ngx_accept_mutex_held == 0 + && (timer == 0 || timer > ngx_accept_mutex_delay)) + { + timer = ngx_accept_mutex_delay; + expire = 0; + } + } if (max_fd == -1) { for (i = 0; i < nevents; i++) { @@ -303,22 +295,41 @@ static int ngx_select_process_events(ngx_cycle_t *cycle) "change max_fd: %d", max_fd); } - if (ngx_accept_mutex) { - if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) { - return NGX_ERROR; - } +#endif - if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) { - timer = ngx_accept_mutex_delay; - expire = 0; - } +#if (NGX_DEBUG) + for (i = 0; i < nevents; i++) { + ev = event_index[i]; + c = ev->data; + ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "select event: fd:%d wr:%d", c->fd, ev->write); } - #endif + if (timer == -1) { + tv.tv_sec = 0; + tv.tv_usec = 0; + tp = &tv; + + } else if (timer) { + tv.tv_sec = timer / 1000; + tv.tv_usec = (timer % 1000) * 1000; + tp = &tv; + + } else { + tp = NULL; + expire = 0; + } + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "select timer: %d", timer); + work_read_fd_set = master_read_fd_set; + work_write_fd_set = master_write_fd_set; + + ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, + "select read fd_set: %08X", *(int *) &work_read_fd_set); + #if (WIN32) ready = select(0, &work_read_fd_set, &work_write_fd_set, NULL, tp); #else @@ -359,6 +370,7 @@ static int ngx_select_process_events(ngx_cycle_t *cycle) if (ready == 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "select() returned no events without timeout"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } } @@ -381,6 +393,7 @@ static int ngx_select_process_events(ngx_cycle_t *cycle) if (ready == 0) { ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, "select() returned no events without timeout"); + ngx_accept_mutex_unlock(); return NGX_ERROR; } } @@ -397,6 +410,7 @@ static int ngx_select_process_events(ngx_cycle_t *cycle) ngx_log_error((err == NGX_EINTR) ? NGX_LOG_INFO : NGX_LOG_ALERT, cycle->log, err, "select() failed"); #endif + ngx_accept_mutex_unlock(); return NGX_ERROR; } diff --git a/src/event/ngx_event_accept.c b/src/event/ngx_event_accept.c index 07fc6a325..0d078e449 100644 --- a/src/event/ngx_event_accept.c +++ b/src/event/ngx_event_accept.c @@ -402,6 +402,10 @@ ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle) */ if (ngx_event_flags & NGX_USE_SIGIO_EVENT) { + if (!cycle->connections[s[i].fd].read->active) { + continue; + } + if (ngx_del_conn(&cycle->connections[s[i].fd], NGX_DISABLE_EVENT) == NGX_ERROR) { @@ -409,6 +413,10 @@ ngx_int_t ngx_disable_accept_events(ngx_cycle_t *cycle) } } else { + if (!cycle->read_events[s[i].fd].active) { + continue; + } + if (ngx_del_event(&cycle->read_events[s[i].fd], NGX_READ_EVENT, NGX_DISABLE_EVENT) == NGX_ERROR) { diff --git a/src/event/ngx_event_posted.c b/src/event/ngx_event_posted.c index 6de723124..73a737756 100644 --- a/src/event/ngx_event_posted.c +++ b/src/event/ngx_event_posted.c @@ -25,9 +25,6 @@ void ngx_event_process_posted(ngx_cycle_t *cycle) return; } - ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, - "posted event handler " PTR_FMT, ev->event_handler); - ngx_posted_events = ev->next; if (ev->accept) { diff --git a/src/event/ngx_event_timer.c b/src/event/ngx_event_timer.c index b66241b66..ab97ee195 100644 --- a/src/event/ngx_event_timer.c +++ b/src/event/ngx_event_timer.c @@ -36,6 +36,7 @@ ngx_int_t ngx_event_timer_init(ngx_log_t *log) ngx_msec_t ngx_event_find_timer(void) { + ngx_msec_t timer; ngx_rbtree_t *node; if (ngx_event_timer_rbtree == &ngx_event_timer_sentinel) { @@ -51,12 +52,14 @@ ngx_msec_t ngx_event_find_timer(void) ngx_mutex_unlock(ngx_event_timer_mutex); - return (ngx_msec_t) + timer = (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 + + return timer > 0 ? timer: -1 ; } diff --git a/src/event/ngx_event_timer.h b/src/event/ngx_event_timer.h index bf5d15515..e0311b61d 100644 --- a/src/event/ngx_event_timer.h +++ b/src/event/ngx_event_timer.h @@ -12,10 +12,10 @@ /* * 32 bit timer key value resolution * - * 1 msec - 49 days - * 10 msec - 1 years 4 months - * 50 msec - 6 years 10 months - * 100 msec - 13 years 8 months + * 1 msec - 24 days + * 10 msec - 8 months + * 50 msec - 3 years 5 months + * 100 msec - 6 years 10 months */ #define NGX_TIMER_RESOLUTION 1 |