]> git.kaiwu.me - nginx.git/commitdiff
*) introduce ngx_time_sigsafe_update() to update the error log time only
authorIgor Sysoev <igor@sysoev.ru>
Thu, 25 Mar 2010 09:10:10 +0000 (09:10 +0000)
committerIgor Sysoev <igor@sysoev.ru>
Thu, 25 Mar 2010 09:10:10 +0000 (09:10 +0000)
*) change ngx_time_update() interface

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 2c3dcc848b362190c23455d89a844746523cd968..80caa1b35124efbd57e54ab2f0f9e06081bd6018 100644 (file)
@@ -63,7 +63,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
     tp = ngx_timeofday();
     tp->sec = 0;
 
-    ngx_time_update(0);
+    ngx_time_update();
 
 
     log = old_cycle->log;
index 94993e291f0fadc006ad5b8aaf12ce93106ea957..d9f5aa28ecbf4fcd4f4379c0b04f02e1da03cbe2 100644 (file)
@@ -28,11 +28,11 @@ 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)
+#if !(NGX_WIN32)
 
 /*
  * locatime() and localtime_r() are not Async-Signal-Safe functions, therefore,
- * if ngx_time_update() is called by signal handler, it uses the cached
+ * they must not be called by a signal handler, so we use the cached
  * GMT offset value. Fortunately the value is changed only two times a year.
  */
 
@@ -61,12 +61,12 @@ ngx_time_init(void)
 
     ngx_cached_time = &cached_time[0];
 
-    ngx_time_update(0);
+    ngx_time_update();
 }
 
 
 void
-ngx_time_update(ngx_uint_t use_cached_gmtoff)
+ngx_time_update(void)
 {
     u_char          *p0, *p1, *p2;
     ngx_tm_t         tm, gmt;
@@ -120,22 +120,16 @@ ngx_time_update(ngx_uint_t use_cached_gmtoff)
     tp->gmtoff = ngx_gettimezone();
     ngx_gmtime(sec + tp->gmtoff * 60, &tm);
 
-#else
-
-    if (use_cached_gmtoff) {
-        ngx_gmtime(sec + cached_gmtoff * 60, &tm);
+#elif (NGX_HAVE_GMTOFF)
 
-    } else {
-        ngx_localtime(sec, &tm);
+    ngx_localtime(sec, &tm);
+    cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);
+    tp->gmtoff = cached_gmtoff;
 
-#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);
+    cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst);
     tp->gmtoff = cached_gmtoff;
 
 #endif
@@ -170,6 +164,59 @@ ngx_time_update(ngx_uint_t use_cached_gmtoff)
 }
 
 
+#if !(NGX_WIN32)
+
+void
+ngx_time_sigsafe_update(void)
+{
+    u_char          *p;
+    ngx_tm_t         tm;
+    time_t           sec;
+    ngx_uint_t       msec;
+    ngx_time_t      *tp;
+    struct timeval   tv;
+
+    if (!ngx_trylock(&ngx_time_lock)) {
+        return;
+    }
+
+    ngx_gettimeofday(&tv);
+
+    sec = tv.tv_sec;
+    msec = tv.tv_usec / 1000;
+
+    tp = &cached_time[slot];
+
+    if (tp->sec == sec) {
+        ngx_unlock(&ngx_time_lock);
+        return;
+    }
+
+    if (slot == NGX_TIME_SLOTS - 1) {
+        slot = 0;
+    } else {
+        slot++;
+    }
+
+    ngx_gmtime(sec + cached_gmtoff * 60, &tm);
+
+    p = &cached_err_log_time[slot][0];
+
+    (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d",
+                       tm.ngx_tm_year, tm.ngx_tm_mon,
+                       tm.ngx_tm_mday, tm.ngx_tm_hour,
+                       tm.ngx_tm_min, tm.ngx_tm_sec);
+
+    ngx_memory_barrier();
+
+    ngx_cached_err_log_time.data = p;
+
+    ngx_unlock(&ngx_time_lock);
+}
+
+#endif
+
+
 u_char *
 ngx_http_time(u_char *buf, time_t t)
 {
index 4259d17d1bcf70c1d6325b446f830e8634088d9d..4e31f00a034e7ae488191ecb47bc425b2e3eefbf 100644 (file)
@@ -20,7 +20,8 @@ typedef struct {
 
 
 void ngx_time_init(void);
-void ngx_time_update(ngx_uint_t use_cached_gmtoff);
+void ngx_time_update(void);
+void ngx_time_sigsafe_update(void);
 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 3655eb98e74bc09855e796c6bb431807b913422b..e88c999b8610eac73f4fe8775a6bb80ffd30ac72 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);
+        ngx_time_update();
     }
 
     if (err) {
index 838573aefb57e1bc802ac5834edd9bf4cbb3756f..91fe1ecb79ef836a745a3b2fb8600e11e0b593ec 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);
+        ngx_time_update();
     }
 
     if (err) {
index 8abf4d38c07cd8db64cbf02d384b56158d1b231a..f4f0119a59782c7b1d4638f3ad8685036a2f48de 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);
+        ngx_time_update();
     }
 
     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);
+            ngx_time_update();
             continue;
         }
 
index 5ce86744273a19d3e8cf7e9011682bf3b14b8dbc..3d63c31622381afbc1a84c9dd2baa2ebd1262124 100644 (file)
@@ -163,7 +163,7 @@ ngx_iocp_timer(void *data)
     for ( ;; ) {
         Sleep(timer);
 
-        ngx_time_update(0);
+        ngx_time_update();
 #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);
+        ngx_time_update();
     }
 
     ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
index e295d834bfaea8d83fd3153ea96935ca55f1825d..d78e56259d36fe793926c5ffb9be41498d4e1ee8 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);
+        ngx_time_update();
     }
 
     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);
+            ngx_time_update();
             continue;
         }
 
index dc11d2ee269cd2521c04d37c3c4e0bd955c7a75c..ea947b7e5f7ec497f386ce9acc85c7fa47ce1116 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);
+        ngx_time_update();
     }
 
     ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
index a8cf4ab57ab159f197d9e611fa8fa285a7db3857..4b011007b0e0c0672e4aa139720cd9e8a0321ddd 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);
+            ngx_time_update();
         }
 
         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);
+        ngx_time_update();
     }
 
     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);
+        ngx_time_update();
 
         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);
+        ngx_time_update();
     }
 
     ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,
index 0ca5facec97c4b134ae751a3648390ce28218395..72dbe74bd69aa008ce963ca6094b06dbbf9b9b66 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);
+        ngx_time_update();
     }
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
index 8a3264df6e7220d4513fa8b68e32dc5a08607163..3d75d69a972035b2b27b805884b832bac6a44ad0 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);
+        ngx_time_update();
     }
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
index d24966fad77bfd879c04d8bc81f2e9c5c136408e..aa6998b53989b947a79ddd275c2c71c7428d5c6d 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);
+        ngx_time_update();
 
         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);
+            ngx_time_update();
         }
 
         cache->last = ngx_current_msec;
index 4c418000a461562c62e485dbf439e706778608ce..224101d2e5edef62c52b61ab60f5afe2e7e3bb89 100644 (file)
@@ -317,7 +317,7 @@ ngx_signal_handler(int signo)
         }
     }
 
-    ngx_time_update(1);
+    ngx_time_sigsafe_update();
 
     action = "";
 
index 18046384ad2efb134ceb0a05b318461259fa0b7d..82d322dfc6ad85c7d3b08a7c300bc0c46d8dd9e6 100644 (file)
@@ -168,7 +168,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
 
         sigsuspend(&set);
 
-        ngx_time_update(0);
+        ngx_time_update();
 
         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);
+            ngx_time_update();
         }
     }
 
@@ -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);
+            ngx_time_update();
         }
     }
 
index 08d9c0ecf028ecbee2328a5587ba36a99ac11481..f4d372bd6e6d9f7b6e40168c7299742c8b775732 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);
+    ngx_time_update();
 
     ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
                    "WaitForMultipleObjects: %ul", rc);
index e4e92b85ce87a8cb492b41d0cda9dcd6dcd879d6..5e9d32cef8ef9356449f00787389e40b9c1dcb15 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);
+        ngx_time_update();
 
         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);
+        ngx_time_update();
 
         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);
+        ngx_time_update();
 
         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);
+        ngx_time_update();
 
         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);
+            ngx_time_update();
         }
     }
 
@@ -980,7 +980,7 @@ ngx_cache_manager_process_handler(void)
 
     if (ev != WAIT_TIMEOUT) {
 
-        ngx_time_update(0);
+        ngx_time_update();
 
         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);
+            ngx_time_update();
         }
     }