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;
timer = ngx_event_find_timer();
if (timer) {
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
delta = tv.tv_sec * 1000 + tv.tv_usec / 1000;
} else {
nchanges = 0;
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
if (ngx_cached_time != tv.tv_sec) {
ngx_cached_time = tv.tv_sec;
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) {
}
#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
}
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;
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) {
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();
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;
}
nchanges = 0;
- gettimeofday(&tv, NULL);
+ ngx_gettimeofday(&tv);
if (ngx_cached_time != tv.tv_sec) {
ngx_cached_time = tv.tv_sec;
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
/*
* 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) {
}
#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
}
{
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;
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) {
}
#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
}
}
#if (WIN32)
+
if ((event == NGX_READ_EVENT) && (max_read >= FD_SETSIZE)
|| (event == NGX_WRITE_EVENT) && (max_write >= FD_SETSIZE))
{
FD_SET(c->fd, &master_write_fd_set);
max_write++;
}
+
#else
+
if (event == NGX_READ_EVENT) {
FD_SET(c->fd, &master_read_fd_set);
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;
#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 {
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) {
}
#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;
return NGX_OK;
}
- if (r->err_status) {
+ if (r->err_ctx) {
r->headers_out.status = r->err_status;
r->headers_out.status_line.len = 0;
}
}
}
- /* clear the modules contexts */
+ if (r->err_ctx) {
+
+ /* allocate the new modules contexts */
- if (r->error_page) {
- r->err_status = r->headers_out.status;
- r->err_ctx = r->ctx;
r->ctx = ngx_pcalloc(r->pool, sizeof(void *) * ngx_http_max_module);
if (r->ctx == NULL) {
return NGX_HTTP_INTERNAL_SERVER_ERROR;
}
} else {
+
+ /* clear the modules contexts */
+
ngx_memzero(r->ctx, sizeof(void *) * ngx_http_max_module);
}
return NGX_ERROR;
}
- /* shift new year to 1st March, needed for Gauss's formula */
+ /* shift new year to March 1, needed for Gauss's formula */
+
if (--month <= 0) {
month += 12;
year -= 1;
}
- /* Gauss's formula for Grigorian days from 1 March 1 BC */
+
+ /* Gauss's formula for Grigorian days from 1 March 1 BC */
+
return (365 * year + year / 4 - year / 100 + year / 400
+ 367 * month / 12 + day - 31
- /* 719527 days are between 1 March 1 BC and 1 March 1970,
- 31 and 28 days in Jan and Feb 1970 */
+ /*
+ * 719527 days are between March 1, 1 BC and March 1, 1970,
+ * 31 and 28 days in January and February 1970
+ */
+
- 719527 + 31 + 28) * 86400 + hour * 3600 + min * 60 + sec;
}
unsigned bypass_cache:1;
unsigned no_cache:1;
- unsigned error_page:1;
-
#if 0
unsigned cachable:1;
#endif
clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
- if (!r->error_page && clcf->error_pages) {
+ if (r->err_ctx == NULL && clcf->error_pages) {
err_page = clcf->error_pages->elts;
for (i = 0; i < clcf->error_pages->nelts; i++) {
if (err_page[i].code == error) {
- r->error_page = 1;
+ r->err_status = error;
+ r->err_ctx = r->ctx;
return ngx_http_internal_redirect(r, &err_page[i].uri, NULL);
}
}
#define SIZE_FMT "%d"
#define SIZEX_FMT "%x"
#define PID_FMT "%d"
+#define TIME_FMT "%lu"
#define SIZE_FMT "%d"
#define SIZEX_FMT "%x"
#define PID_FMT "%ld"
+#define TIME_FMT "%lu"
#ifndef HAVE_SELECT
void ngx_localtime(ngx_tm_t *tm)
{
+#if (HAVE_LOCALTIME_R)
+
localtime_r(&ngx_cached_time, tm);
- tm->ngx_tm_mon++;
- tm->ngx_tm_year += 1900;
-}
+#else
+ ngx_tm_t *t;
-u_int ngx_msec(void)
-{
- struct timeval tv;
+ t = localtime(&ngx_cached_time);
+ *tm = *t;
- gettimeofday(&tv, NULL);
+#endif
- return tv.tv_sec * 1000 + tv.tv_usec / 1000;
+ tm->ngx_tm_mon++;
+ tm->ngx_tm_year += 1900;
}
+
#if 0
typedef struct {
#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+typedef uint64_t ngx_epoch_msec_t;
typedef u_int ngx_msec_t;
-#define NGX_MAX_MSEC (u_int) -1
+#define NGX_MAX_MSEC (ngx_msec_t) -1
typedef struct tm ngx_tm_t;
#define ngx_tm_year tm_year
#define ngx_tm_wday tm_wday
-#define ngx_msleep(ms) usleep(ms * 1000)
void ngx_localtime(ngx_tm_t *tm);
-ngx_msec_t ngx_msec(void);
+#define ngx_gettimeofday(tp) gettimeofday(tp, NULL);
+#define ngx_msleep(ms) usleep(ms * 1000)
-time_t ngx_time();
extern time_t ngx_cached_time;
-
#endif /* _NGX_TIME_H_INCLUDED_ */
#define ngx_file_uniq(fi) (*(ngx_file_uniq_t *) &fi.nFileIndexHigh)
-/* There are 134774 days between 1 Jan 1970 and 1 Jan 1601,
- 11644473600 seconds or 11644473600,000,000,0 100-nanosecond intervals */
+
+/* 116444736000000000 is commented in src/os/win32/ngx_time.c */
#define ngx_file_mtime(fi) \
(time_t) (((((unsigned __int64) fi.ftLastWriteTime.dwHighDateTime << 32) \
--- /dev/null
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+void ngx_gettimeofday(struct timeval *tp)
+{
+ uint64_t intervals;
+ FILETIME ft;
+
+ GetSystemTimeAsFileTime(&ft);
+
+ /*
+ * A file time is a 64-bit value that represents the number
+ * of 100-nanosecond intervals that have elapsed since
+ * 12:00 A.M. January 1, 1601 (UTC).
+ *
+ * Between January 1, 1970 (Epoch) and January 1, 1601 there are
+ * 134744 days,
+ * 11644473600 seconds or
+ * 11644473600,000,000,0 100-nanosecond intervals.
+ */
+
+ intervals = ((uint64_t) ft.dwHighDateTime << 32) | ft.dwLowDateTime;
+ intervals -= 116444736000000000;
+
+ tp->tv_sec = intervals / 10000000;
+ tp->tv_usec = (intervals % 10000000) / 10;
+}
#include <ngx_core.h>
-typedef unsigned int ngx_msec_t;
-#define NGX_MAX_MSEC ~0
+typedef uint64_t ngx_epoch_msec_t;
+
+typedef u_int ngx_msec_t;
+#define NGX_MAX_MSEC (ngx_msec_t) -1
typedef SYSTEMTIME ngx_tm_t;
#define ngx_msleep Sleep
#define ngx_localtime GetLocalTime
-#define ngx_msec GetTickCount
-/* STUB */
-#define ngx_time() time(NULL)
+
+struct timeval {
+ long tv_sec;
+ long tv_usec;
+};
+
+
+void ngx_gettimeofday(struct timeval *tp);
+
#endif /* _NGX_TIME_H_INCLUDED_ */