aboutsummaryrefslogtreecommitdiff
path: root/src/event/modules/ngx_select_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/modules/ngx_select_module.c')
-rw-r--r--src/event/modules/ngx_select_module.c74
1 files changed, 44 insertions, 30 deletions
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;
}