*) use previously cached GMT offset value to update time from a signal handler *) change ngx_time_update() interface since there are no notification methods those return time
diff --git a/src/core/ngx_cycle.c b/src/core/ngx_cycle.c index d77dcc1..2c3dcc8 100644 --- a/src/core/ngx_cycle.c +++ b/src/core/ngx_cycle.c
@@ -63,7 +63,7 @@ tp = ngx_timeofday(); tp->sec = 0; - ngx_time_update(0, 0); + ngx_time_update(0); log = old_cycle->log;
diff --git a/src/core/ngx_times.c b/src/core/ngx_times.c index 3105beb..94993e2 100644 --- a/src/core/ngx_times.c +++ b/src/core/ngx_times.c
@@ -28,6 +28,17 @@ volatile ngx_str_t ngx_cached_http_time; volatile ngx_str_t ngx_cached_http_log_time; +#if !(NGX_HAVE_GETTIMEZONE) + +/* + * locatime() and localtime_r() are not Async-Signal-Safe functions, therefore, + * if ngx_time_update() is called by signal handler, it uses the cached + * GMT offset value. Fortunately the value is changed only two times a year. + */ + +static ngx_int_t cached_gmtoff; +#endif + static ngx_time_t cached_time[NGX_TIME_SLOTS]; static u_char cached_err_log_time[NGX_TIME_SLOTS] [sizeof("1970/09/28 12:00:00")]; @@ -50,15 +61,17 @@ ngx_cached_time = &cached_time[0]; - ngx_time_update(0, 0); + ngx_time_update(0); } void -ngx_time_update(time_t sec, ngx_uint_t msec) +ngx_time_update(ngx_uint_t use_cached_gmtoff) { u_char *p0, *p1, *p2; ngx_tm_t tm, gmt; + time_t sec; + ngx_uint_t msec; ngx_time_t *tp; struct timeval tv; @@ -66,12 +79,10 @@ return; } - if (sec == 0) { - ngx_gettimeofday(&tv); + ngx_gettimeofday(&tv); - sec = tv.tv_sec; - msec = tv.tv_usec / 1000; - } + sec = tv.tv_sec; + msec = tv.tv_usec / 1000; ngx_current_msec = (ngx_msec_t) sec * 1000 + msec; @@ -109,15 +120,23 @@ tp->gmtoff = ngx_gettimezone(); ngx_gmtime(sec + tp->gmtoff * 60, &tm); -#elif (NGX_HAVE_GMTOFF) - - ngx_localtime(sec, &tm); - tp->gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); - #else - ngx_localtime(sec, &tm); - tp->gmtoff = ngx_timezone(tm.ngx_tm_isdst); + if (use_cached_gmtoff) { + ngx_gmtime(sec + cached_gmtoff * 60, &tm); + + } else { + ngx_localtime(sec, &tm); + +#if (NGX_HAVE_GMTOFF) + cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); +#else + cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst); +#endif + + } + + tp->gmtoff = cached_gmtoff; #endif
diff --git a/src/core/ngx_times.h b/src/core/ngx_times.h index 8363ca1..4259d17 100644 --- a/src/core/ngx_times.h +++ b/src/core/ngx_times.h
@@ -20,7 +20,7 @@ void ngx_time_init(void); -void ngx_time_update(time_t sec, ngx_uint_t msec); +void ngx_time_update(ngx_uint_t use_cached_gmtoff); u_char *ngx_http_time(u_char *buf, time_t t); u_char *ngx_http_cookie_time(u_char *buf, time_t t); void ngx_gmtime(time_t t, ngx_tm_t *tp);
diff --git a/src/event/modules/ngx_devpoll_module.c b/src/event/modules/ngx_devpoll_module.c index f133b72..3655eb9 100644 --- a/src/event/modules/ngx_devpoll_module.c +++ b/src/event/modules/ngx_devpoll_module.c
@@ -372,7 +372,7 @@ err = (events == -1) ? ngx_errno : 0; if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(0, 0); + ngx_time_update(0); } if (err) {
diff --git a/src/event/modules/ngx_epoll_module.c b/src/event/modules/ngx_epoll_module.c index 3c1ca2a..838573a 100644 --- a/src/event/modules/ngx_epoll_module.c +++ b/src/event/modules/ngx_epoll_module.c
@@ -532,7 +532,7 @@ err = (events == -1) ? ngx_errno : 0; if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(0, 0); + ngx_time_update(0); } if (err) {
diff --git a/src/event/modules/ngx_eventport_module.c b/src/event/modules/ngx_eventport_module.c index 842d631..8abf4d3 100644 --- a/src/event/modules/ngx_eventport_module.c +++ b/src/event/modules/ngx_eventport_module.c
@@ -405,7 +405,7 @@ err = ngx_errno; if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } if (n == -1) { @@ -439,7 +439,7 @@ for (i = 0; i < events; i++) { if (event_list[i].portev_source == PORT_SOURCE_TIMER) { - ngx_time_update(0, 0); + ngx_time_update(0); continue; }
diff --git a/src/event/modules/ngx_iocp_module.c b/src/event/modules/ngx_iocp_module.c index 8375171..5ce8674 100644 --- a/src/event/modules/ngx_iocp_module.c +++ b/src/event/modules/ngx_iocp_module.c
@@ -163,7 +163,7 @@ for ( ;; ) { Sleep(timer); - ngx_time_update(0, 0); + ngx_time_update(0); #if 1 ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer"); #endif @@ -258,7 +258,7 @@ delta = ngx_current_msec; if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
diff --git a/src/event/modules/ngx_kqueue_module.c b/src/event/modules/ngx_kqueue_module.c index b6dfa8f..e295d83 100644 --- a/src/event/modules/ngx_kqueue_module.c +++ b/src/event/modules/ngx_kqueue_module.c
@@ -538,7 +538,7 @@ err = (events == -1) ? ngx_errno : 0; if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, @@ -589,7 +589,7 @@ #if (NGX_HAVE_TIMER_EVENT) if (event_list[i].filter == EVFILT_TIMER) { - ngx_time_update(0, 0); + ngx_time_update(0); continue; }
diff --git a/src/event/modules/ngx_poll_module.c b/src/event/modules/ngx_poll_module.c index 3b98c19..dc11d2e 100644 --- a/src/event/modules/ngx_poll_module.c +++ b/src/event/modules/ngx_poll_module.c
@@ -263,7 +263,7 @@ err = (ready == -1) ? ngx_errno : 0; if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
diff --git a/src/event/modules/ngx_rtsig_module.c b/src/event/modules/ngx_rtsig_module.c index 926be0d..a8cf4ab 100644 --- a/src/event/modules/ngx_rtsig_module.c +++ b/src/event/modules/ngx_rtsig_module.c
@@ -323,7 +323,7 @@ "rtsig signo:%d", signo); if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } if (err == NGX_EAGAIN) { @@ -349,7 +349,7 @@ signo, si.si_fd, si.si_band); if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); @@ -419,7 +419,7 @@ } else if (signo == SIGALRM) { - ngx_time_update(0, 0); + ngx_time_update(0); return NGX_OK; @@ -671,7 +671,7 @@ } if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
diff --git a/src/event/modules/ngx_select_module.c b/src/event/modules/ngx_select_module.c index 9f5b43b..0ca5fac 100644 --- a/src/event/modules/ngx_select_module.c +++ b/src/event/modules/ngx_select_module.c
@@ -263,7 +263,7 @@ err = (ready == -1) ? ngx_errno : 0; if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
diff --git a/src/event/modules/ngx_win32_select_module.c b/src/event/modules/ngx_win32_select_module.c index 8c22f39..8a3264d 100644 --- a/src/event/modules/ngx_win32_select_module.c +++ b/src/event/modules/ngx_win32_select_module.c
@@ -269,7 +269,7 @@ err = (ready == -1) ? ngx_socket_errno : 0; if (flags & NGX_UPDATE_TIME) { - ngx_time_update(0, 0); + ngx_time_update(0); } ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
diff --git a/src/http/ngx_http_file_cache.c b/src/http/ngx_http_file_cache.c index bd315ea..d24966f 100644 --- a/src/http/ngx_http_file_cache.c +++ b/src/http/ngx_http_file_cache.c
@@ -1216,7 +1216,7 @@ if (cache->files++ > 100) { - ngx_time_update(0, 0); + ngx_time_update(0); elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last)); @@ -1233,7 +1233,7 @@ ngx_msleep(200); - ngx_time_update(0, 0); + ngx_time_update(0); } cache->last = ngx_current_msec;
diff --git a/src/os/unix/ngx_process.c b/src/os/unix/ngx_process.c index 0d08349..4c41800 100644 --- a/src/os/unix/ngx_process.c +++ b/src/os/unix/ngx_process.c
@@ -317,7 +317,7 @@ } } - ngx_time_update(0, 0); + ngx_time_update(1); action = "";
diff --git a/src/os/unix/ngx_process_cycle.c b/src/os/unix/ngx_process_cycle.c index 06e020e..1804638 100644 --- a/src/os/unix/ngx_process_cycle.c +++ b/src/os/unix/ngx_process_cycle.c
@@ -168,7 +168,7 @@ sigsuspend(&set); - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, "wake up, sigio %i", sigio); @@ -1342,7 +1342,7 @@ next = (n <= next) ? n : next; - ngx_time_update(0, 0); + ngx_time_update(0); } } @@ -1372,7 +1372,7 @@ if (path[i]->loader) { path[i]->loader(path[i]->data); - ngx_time_update(0, 0); + ngx_time_update(0); } }
diff --git a/src/os/win32/ngx_process.c b/src/os/win32/ngx_process.c index e57adb4..08d9c0e 100644 --- a/src/os/win32/ngx_process.c +++ b/src/os/win32/ngx_process.c
@@ -85,7 +85,7 @@ rc = WaitForMultipleObjects(2, events, 0, 5000); - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "WaitForMultipleObjects: %ul", rc);
diff --git a/src/os/win32/ngx_process_cycle.c b/src/os/win32/ngx_process_cycle.c index e3b513a..e4e92b8 100644 --- a/src/os/win32/ngx_process_cycle.c +++ b/src/os/win32/ngx_process_cycle.c
@@ -140,7 +140,7 @@ ev = WaitForMultipleObjects(nev, events, 0, timeout); err = ngx_errno; - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "master WaitForMultipleObjects: %ul", ev); @@ -679,7 +679,7 @@ ev = WaitForMultipleObjects(3, events, 0, INFINITE); err = ngx_errno; - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "worker WaitForMultipleObjects: %ul", ev); @@ -738,7 +738,7 @@ ev = WaitForMultipleObjects(nev, events, 0, INFINITE); err = ngx_errno; - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, "worker exit WaitForMultipleObjects: %ul", ev); @@ -907,7 +907,7 @@ ev = WaitForMultipleObjects(2, events, 0, INFINITE); err = ngx_errno; - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, "cache manager WaitForMultipleObjects: %ul", ev); @@ -968,7 +968,7 @@ next = (n <= next) ? n : next; - ngx_time_update(0, 0); + ngx_time_update(0); } } @@ -980,7 +980,7 @@ if (ev != WAIT_TIMEOUT) { - ngx_time_update(0, 0); + ngx_time_update(0); ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, "cache manager WaitForSingleObject: %ul", ev); @@ -1008,7 +1008,7 @@ if (path[i]->loader) { path[i]->loader(path[i]->data); - ngx_time_update(0, 0); + ngx_time_update(0); } }