]> git.kaiwu.me - nginx.git/commitdiff
*) use previously cached GMT offset value to update time from a signal handler
authorIgor Sysoev <igor@sysoev.ru>
Sat, 13 Mar 2010 18:08:07 +0000 (18:08 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Sat, 13 Mar 2010 18:08:07 +0000 (18:08 +0000)
*) change ngx_time_update() interface since there are no notification methods
   those return time

17 files changed:
src/core/ngx_cycle.c
src/core/ngx_times.c
src/core/ngx_times.h
src/event/modules/ngx_devpoll_module.c
src/event/modules/ngx_epoll_module.c
src/event/modules/ngx_eventport_module.c
src/event/modules/ngx_iocp_module.c
src/event/modules/ngx_kqueue_module.c
src/event/modules/ngx_poll_module.c
src/event/modules/ngx_rtsig_module.c
src/event/modules/ngx_select_module.c
src/event/modules/ngx_win32_select_module.c
src/http/ngx_http_file_cache.c
src/os/unix/ngx_process.c
src/os/unix/ngx_process_cycle.c
src/os/win32/ngx_process.c
src/os/win32/ngx_process_cycle.c

index d77dcc13dafd0f7619de9aa3c35fd98de62840d1..2c3dcc848b362190c23455d89a844746523cd968 100644 (file)
@@ -63,7 +63,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     tp = ngx_timeofday();
     tp->sec = 0;
 
-    ngx_time_update(0, 0);
+    ngx_time_update(0);
 
 
     log = old_cycle->log;
index 3105beb47f4b8cf8241adb7e67c6129b04c1d752..94993e291f0fadc006ad5b8aaf12ce93106ea957 100644 (file)
@@ -28,6 +28,17 @@ volatile ngx_str_t       ngx_cached_err_log_time;
 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_time_init(void)
 
     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 @@ ngx_time_update(time_t sec, ngx_uint_t msec)
         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 @@ ngx_time_update(time_t sec, ngx_uint_t msec)
     tp->gmtoff = ngx_gettimezone();
     ngx_gmtime(sec + tp->gmtoff * 60, &tm);
 
-#elif (NGX_HAVE_GMTOFF)
+#else
+
+    if (use_cached_gmtoff) {
+        ngx_gmtime(sec + cached_gmtoff * 60, &tm);
 
-    ngx_localtime(sec, &tm);
-    tp->gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);
+    } 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
+
+    }
 
-    ngx_localtime(sec, &tm);
-    tp->gmtoff = ngx_timezone(tm.ngx_tm_isdst);
+    tp->gmtoff = cached_gmtoff;
 
 #endif
 
index 8363ca1362670d3453fcbc699dc757cc0107837b..4259d17d1bcf70c1d6325b446f830e8634088d9d 100644 (file)
@@ -20,7 +20,7 @@ typedef struct {
 
 
 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);
index f133b7249101acd9007f3fae7767e80698c3b8a7..3655eb98e74bc09855e796c6bb431807b913422b 100644 (file)
@@ -372,7 +372,7 @@ ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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) {
index 3c1ca2ac2fd46df5c35a272bf69ffead4dff6f2c..838573aefb57e1bc802ac5834edd9bf4cbb3756f 100644 (file)
@@ -532,7 +532,7 @@ ngx_epoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
     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) {
index 842d631afc01cba80eb6c0ebdd2dd762e34f3722..8abf4d38c07cd8db64cbf02d384b56158d1b231a 100644 (file)
@@ -405,7 +405,7 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     err = ngx_errno;
 
     if (flags & NGX_UPDATE_TIME) {
-        ngx_time_update(0, 0);
+        ngx_time_update(0);
     }
 
     if (n == -1) {
@@ -439,7 +439,7 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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;
         }
 
index 837517151af7639000bddefa5f4577a2cc456b8b..5ce86744273a19d3e8cf7e9011682bf3b14b8dbc 100644 (file)
@@ -163,7 +163,7 @@ ngx_iocp_timer(void *data)
     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 @@ ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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,
index b6dfa8fa1c38585a325660e253fab1ed947cb7e1..e295d834bfaea8d83fd3153ea96935ca55f1825d 100644 (file)
@@ -538,7 +538,7 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
 #if (NGX_HAVE_TIMER_EVENT)
 
         if (event_list[i].filter == EVFILT_TIMER) {
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
             continue;
         }
 
index 3b98c19fe9ccefe0e7d7330620f509e6c569280c..dc11d2ee269cd2521c04d37c3c4e0bd955c7a75c 100644 (file)
@@ -263,7 +263,7 @@ ngx_poll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
     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,
index 926be0de366c965d12a484eaced2358ec220b799..a8cf4ab57ab159f197d9e611fa8fa285a7db3857 100644 (file)
@@ -323,7 +323,7 @@ ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
                        "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 @@ ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
                    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 @@ ngx_rtsig_process_events(ngx_cycle_t *cycle, ngx_msec_t timer, ngx_uint_t flags)
 
     } else if (signo == SIGALRM) {
 
-        ngx_time_update(0, 0);
+        ngx_time_update(0);
 
         return NGX_OK;
 
@@ -671,7 +671,7 @@ ngx_rtsig_process_overflow(ngx_cycle_t *cycle, ngx_msec_t timer,
     }
 
     if (flags & NGX_UPDATE_TIME) {
-        ngx_time_update(0, 0);
+        ngx_time_update(0);
     }
 
     ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
index 9f5b43b712c45369bfd28c616c944cc0dd9b1c51..0ca5facec97c4b134ae751a3648390ce28218395 100644 (file)
@@ -263,7 +263,7 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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,
index 8c22f397ab800caf6642acfeac889a1a54050049..8a3264df6e7220d4513fa8b68e32dc5a08607163 100644 (file)
@@ -269,7 +269,7 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
     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,
index bd315eaa2e6ad658e7ce69eb67f8f1fa47f6c410..d24966fad77bfd879c04d8bc81f2e9c5c136408e 100644 (file)
@@ -1216,7 +1216,7 @@ ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
 
     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_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
 
             ngx_msleep(200);
 
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
         }
 
         cache->last = ngx_current_msec;
index 0d08349ee7798d072f92b7b335ab1c55f74c7945..4c418000a461562c62e485dbf439e706778608ce 100644 (file)
@@ -317,7 +317,7 @@ ngx_signal_handler(int signo)
         }
     }
 
-    ngx_time_update(0, 0);
+    ngx_time_update(1);
 
     action = "";
 
index 06e020e06a15cddbd64424b0defc3d42b684f6c1..18046384ad2efb134ceb0a05b318461259fa0b7d 100644 (file)
@@ -168,7 +168,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
 
         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 @@ ngx_cache_manager_process_handler(ngx_event_t *ev)
 
             next = (n <= next) ? n : next;
 
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
         }
     }
 
@@ -1372,7 +1372,7 @@ ngx_cache_loader_process_handler(ngx_event_t *ev)
 
         if (path[i]->loader) {
             path[i]->loader(path[i]->data);
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
         }
     }
 
index e57adb48448e5743d5b69f4cc58c10879adebdff..08d9c0ecf028ecbee2328a5587ba36a99ac11481 100644 (file)
@@ -85,7 +85,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
 
     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);
index e3b513a1c1c5752b795748fb2ecc385f5f039bde..e4e92b85ce87a8cb492b41d0cda9dcd6dcd879d6 100644 (file)
@@ -140,7 +140,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
         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 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)
         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 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)
         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 @@ ngx_cache_manager_thread(void *data)
         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 @@ ngx_cache_manager_process_handler(void)
 
             next = (n <= next) ? n : next;
 
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
         }
     }
 
@@ -980,7 +980,7 @@ ngx_cache_manager_process_handler(void)
 
     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 @@ ngx_cache_loader_thread(void *data)
 
         if (path[i]->loader) {
             path[i]->loader(path[i]->data);
-            ngx_time_update(0, 0);
+            ngx_time_update(0);
         }
     }