summaryrefslogtreecommitdiffhomepage
path: root/src/event/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/modules')
-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
4 files changed, 72 insertions, 37 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;
}