nginx-0.0.3-2004-04-14-21:44:28 import
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c
index 4b76f86..cad7ed9 100644
--- a/src/event/modules/ngx_epoll_module.c
+++ b/src/event/modules/ngx_epoll_module.c
@@ -356,7 +356,11 @@
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 @@
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 454d7db..bf37bf5 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -383,7 +383,12 @@
}
}
- 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 dd98eca..ffe59d4 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -125,6 +125,8 @@
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 @@
ev->index = e->index;
}
- ev->active = 1;
ev->oneshot = (flags & NGX_ONESHOT_EVENT) ? 1 : 0;
return NGX_OK;
@@ -278,7 +279,11 @@
} 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 @@
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 @@
}
}
- 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 596ee6a..0f3848d 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -263,34 +263,26 @@
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;
-
- } else {
- tp = NULL;
- 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
+ expire = 1;
#if !(WIN32)
+ if (ngx_accept_mutex) {
+ if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
+ return NGX_ERROR;
+ }
+
+ 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++) {
c = event_index[i]->data;
@@ -303,22 +295,41 @@
"change max_fd: %d", max_fd);
}
- if (ngx_accept_mutex) {
- if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
- return NGX_ERROR;
- }
-
- if (ngx_accept_mutex_held == 0 && timer > ngx_accept_mutex_delay) {
- timer = ngx_accept_mutex_delay;
- expire = 0;
- }
- }
-
#endif
+#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 @@
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 @@
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 @@
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;
}