aboutsummaryrefslogtreecommitdiff
path: root/src/event
diff options
context:
space:
mode:
Diffstat (limited to 'src/event')
-rw-r--r--src/event/modules/ngx_epoll_module.c10
-rw-r--r--src/event/modules/ngx_kqueue_module.c7
-rw-r--r--src/event/modules/ngx_poll_module.c18
-rw-r--r--src/event/modules/ngx_select_module.c74
-rw-r--r--src/event/ngx_event_accept.c8
-rw-r--r--src/event/ngx_event_posted.c3
-rw-r--r--src/event/ngx_event_timer.c5
-rw-r--r--src/event/ngx_event_timer.h8
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