summaryrefslogtreecommitdiffhomepage
path: root/src/event/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/modules')
-rw-r--r--src/event/modules/ngx_devpoll_module.c13
-rw-r--r--src/event/modules/ngx_iocp_module.c17
-rw-r--r--src/event/modules/ngx_kqueue_module.c25
-rw-r--r--src/event/modules/ngx_poll_module.c22
-rw-r--r--src/event/modules/ngx_select_module.c78
5 files changed, 109 insertions, 46 deletions
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c
index 9bc743426..c8f368406 100644
--- a/src/event/modules/ngx_devpoll_module.c
+++ b/src/event/modules/ngx_devpoll_module.c
@@ -322,9 +322,10 @@ static int ngx_devpoll_set_event(ngx_event_t *ev, int event, u_int flags)
int ngx_devpoll_process_events(ngx_log_t *log)
{
int events, n, i, j;
- ngx_msec_t timer, delta;
+ ngx_msec_t timer;
ngx_err_t err;
ngx_cycle_t **cycle;
+ ngx_epoch_msec_t delta;
ngx_connection_t *c;
struct dvpoll dvp;
struct timeval tv;
@@ -332,7 +333,7 @@ int ngx_devpoll_process_events(ngx_log_t *log)
timer = ngx_event_find_timer();
if (timer) {
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
@@ -366,7 +367,7 @@ int ngx_devpoll_process_events(ngx_log_t *log)
nchanges = 0;
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
if (ngx_cached_time != tv.tv_sec) {
ngx_cached_time = tv.tv_sec;
@@ -377,9 +378,9 @@ int ngx_devpoll_process_events(ngx_log_t *log)
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta);
#endif
- ngx_event_expire_timers(delta);
+ ngx_event_expire_timers((ngx_msec_t) delta);
} else {
if (events == 0) {
@@ -389,7 +390,7 @@ int ngx_devpoll_process_events(ngx_log_t *log)
}
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "devpoll timer: %d, delta: %d" _ timer _ (int)delta);
#endif
}
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c
index 0a5ac5bd7..99a1eee4e 100644
--- a/src/event/modules/ngx_iocp_module.c
+++ b/src/event/modules/ngx_iocp_module.c
@@ -162,14 +162,16 @@ static int ngx_iocp_process_events(ngx_log_t *log)
u_int key;
size_t bytes;
ngx_err_t err;
- ngx_msec_t timer, delta;
+ ngx_msec_t timer;
ngx_event_t *ev;
+ ngx_epoch_msec_t delta;
ngx_event_ovlp_t *ovlp;
timer = ngx_event_find_timer();
if (timer) {
- delta = ngx_msec();
+ ngx_gettimeofday(&tv);
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
timer = INFINITE;
@@ -189,11 +191,16 @@ static int ngx_iocp_process_events(ngx_log_t *log)
err = 0;
}
- /* TODO: timer */
+ ngx_gettimeofday(&tv);
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
if (timer != INFINITE) {
- delta = ngx_msec() - delta;
- ngx_event_expire_timers(delta);
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
+ ngx_event_expire_timers((ngx_msec_t) delta);
}
if (err) {
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c
index 831bc7720..d43fb0e15 100644
--- a/src/event/modules/ngx_kqueue_module.c
+++ b/src/event/modules/ngx_kqueue_module.c
@@ -311,12 +311,13 @@ static int ngx_kqueue_set_event(ngx_event_t *ev, int filter, u_int flags)
static int ngx_kqueue_process_events(ngx_log_t *log)
{
- int events, instance, i;
- ngx_err_t err;
- ngx_msec_t timer, delta;
- ngx_event_t *ev;
- struct timeval tv;
- struct timespec ts, *tp;
+ int events, instance, i;
+ ngx_err_t err;
+ ngx_msec_t timer;
+ ngx_event_t *ev;
+ ngx_epoch_msec_t delta;
+ struct timeval tv;
+ struct timespec ts, *tp;
timer = ngx_event_find_timer();
@@ -324,11 +325,11 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
ts.tv_sec = timer / 1000;
ts.tv_nsec = (timer % 1000) * 1000000;
tp = &ts;
- gettimeofday(&tv, NULL);
+
+ ngx_gettimeofday(&tv);
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
- timer = 0;
delta = 0;
tp = NULL;
}
@@ -347,7 +348,7 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
nchanges = 0;
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
if (ngx_cached_time != tv.tv_sec) {
ngx_cached_time = tv.tv_sec;
@@ -358,7 +359,7 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
#endif
/*
@@ -366,7 +367,7 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
* because the new timers can be added during a processing
*/
- ngx_event_expire_timers(delta);
+ ngx_event_expire_timers((ngx_msec_t) delta);
} else {
if (events == 0) {
@@ -376,7 +377,7 @@ static int ngx_kqueue_process_events(ngx_log_t *log)
}
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "kevent timer: %d, delta: %d" _ timer _ (int) delta);
#endif
}
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c
index 34f2b1191..e771e92fe 100644
--- a/src/event/modules/ngx_poll_module.c
+++ b/src/event/modules/ngx_poll_module.c
@@ -224,16 +224,19 @@ static int ngx_poll_process_events(ngx_log_t *log)
{
int ready, found, j;
u_int nready, i;
- ngx_msec_t timer, delta;
+ ngx_msec_t timer;
ngx_err_t err;
ngx_cycle_t **cycle;
ngx_event_t *ev;
+ ngx_epoch_msec_t delta;
ngx_connection_t *c;
+ struct timeval tv;
timer = ngx_event_find_timer();
if (timer) {
- delta = ngx_msec();
+ ngx_gettimeofday(&tv);
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
timer = INFTIM;
@@ -259,15 +262,20 @@ static int ngx_poll_process_events(ngx_log_t *log)
ngx_log_debug(log, "poll ready %d" _ ready);
- /* TODO: time */
+ ngx_gettimeofday(&tv);
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
if ((int) timer != INFTIM) {
- delta = ngx_msec() - delta;
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta);
#endif
- ngx_event_expire_timers(delta);
+ ngx_event_expire_timers((ngx_msec_t) delta);
} else {
if (ready == 0) {
@@ -277,7 +285,7 @@ static int ngx_poll_process_events(ngx_log_t *log)
}
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "poll timer: %d, delta: %d" _ timer _ (int) delta);
#endif
}
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c
index 082c0e335..1cde073a1 100644
--- a/src/event/modules/ngx_select_module.c
+++ b/src/event/modules/ngx_select_module.c
@@ -148,6 +148,7 @@ static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags)
}
#if (WIN32)
+
if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE)
|| (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE))
{
@@ -165,7 +166,9 @@ static int ngx_select_add_event(ngx_event_t *ev, int event, u_int flags)
FD_SET(c->fd, &master_write_fd_set);
max_write++;
}
+
#else
+
if (event == NGX_READ_EVENT) {
FD_SET(c->fd, &master_read_fd_set);
@@ -247,10 +250,14 @@ static int ngx_select_process_events(ngx_log_t *log)
int ready, found;
u_int i, nready;
ngx_err_t err;
- ngx_msec_t timer, delta;
+ ngx_msec_t timer;
ngx_event_t *ev;
ngx_connection_t *c;
+ ngx_epoch_msec_t delta;
struct timeval tv, *tp;
+#if (HAVE_SELECT_CHANGE_TIMEOUT)
+ static ngx_epoch_msec_t deltas = 0;
+#endif
work_read_fd_set = master_read_fd_set;
work_write_fd_set = master_write_fd_set;
@@ -264,7 +271,8 @@ static int ngx_select_process_events(ngx_log_t *log)
#if (HAVE_SELECT_CHANGE_TIMEOUT)
delta = 0;
#else
- delta = ngx_msec();
+ ngx_gettimeofday(&tv);
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
#endif
} else {
@@ -314,32 +322,69 @@ static int ngx_select_process_events(ngx_log_t *log)
ngx_log_debug(log, "select ready %d" _ ready);
#endif
- /* TODO: time */
+#if (HAVE_SELECT_CHANGE_TIMEOUT)
if (timer) {
-#if (HAVE_SELECT_CHANGE_TIMEOUT)
delta = timer - (tv.tv_sec * 1000 + tv.tv_usec / 1000);
-#if 0
/*
- * update the cached time if the sum of the last deltas
- * is more than 0.5 seconds
+ * learn the real time and update the cached time
+ * if the sum of the last deltas overcomes 1 second
*/
+
deltas += delta;
- if (deltas > 500000) {
- ngx_cached_time = ngx_real_time();
- deltas = 0;
+ if (deltas > 1000) {
+ ngx_gettimeofday(&tv);
+ deltas = tv.tv_usec / 1000;
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
}
+
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
#endif
-#else
- delta = ngx_msec() - delta;
+ ngx_event_expire_timers((ngx_msec_t) delta);
+
+ } else {
+ ngx_gettimeofday(&tv);
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
+
+ if (ready == 0) {
+ ngx_log_error(NGX_LOG_ALERT, log, 0,
+ "select() returned no events without timeout");
+ return NGX_ERROR;
+ }
+
+#if (NGX_DEBUG_EVENT)
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
#endif
+ }
+
+#else /* HAVE_SELECT_CHANGE_TIMEOUT */
+
+ ngx_gettimeofday(&tv);
+
+ if (ngx_cached_time != tv.tv_sec) {
+ ngx_cached_time = tv.tv_sec;
+ ngx_time_update();
+ }
+
+ if (timer) {
+ delta = tv.tv_sec * 1000 + tv.tv_usec / 1000 - delta;
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
#endif
- ngx_event_expire_timers(delta);
+
+ ngx_event_expire_timers((ngx_msec_t) delta);
} else {
if (ready == 0) {
@@ -349,11 +394,12 @@ static int ngx_select_process_events(ngx_log_t *log)
}
#if (NGX_DEBUG_EVENT)
- ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ delta);
+ ngx_log_debug(log, "select timer: %d, delta: %d" _ timer _ (int) delta);
#endif
- ngx_event_expire_timers(delta);
}
+#endif /* HAVE_SELECT_CHANGE_TIMEOUT */
+
if (err) {
ngx_log_error(NGX_LOG_ALERT, log, err, "select() failed");
return NGX_ERROR;