*) introduce ngx_time_sigsafe_update() to update the error log time only

*) change ngx_time_update() interface
This commit is contained in:
Igor Sysoev 2010-03-25 09:10:10 +00:00
parent 2f916a9721
commit 6d45d8a50d
17 changed files with 97 additions and 49 deletions

View File

@ -63,7 +63,7 @@ ngx_init_cycle(ngx_cycle_t *old_cycle)
tp = ngx_timeofday(); tp = ngx_timeofday();
tp->sec = 0; tp->sec = 0;
ngx_time_update(0); ngx_time_update();
log = old_cycle->log; log = old_cycle->log;

View 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_time;
volatile ngx_str_t ngx_cached_http_log_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, * 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. * 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_cached_time = &cached_time[0];
ngx_time_update(0); ngx_time_update();
} }
void void
ngx_time_update(ngx_uint_t use_cached_gmtoff) ngx_time_update(void)
{ {
u_char *p0, *p1, *p2; u_char *p0, *p1, *p2;
ngx_tm_t tm, gmt; ngx_tm_t tm, gmt;
@ -120,22 +120,16 @@ ngx_time_update(ngx_uint_t use_cached_gmtoff)
tp->gmtoff = ngx_gettimezone(); tp->gmtoff = ngx_gettimezone();
ngx_gmtime(sec + tp->gmtoff * 60, &tm); ngx_gmtime(sec + tp->gmtoff * 60, &tm);
#elif (NGX_HAVE_GMTOFF)
ngx_localtime(sec, &tm);
cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60);
tp->gmtoff = cached_gmtoff;
#else #else
if (use_cached_gmtoff) { ngx_localtime(sec, &tm);
ngx_gmtime(sec + cached_gmtoff * 60, &tm); cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst);
} 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; tp->gmtoff = cached_gmtoff;
#endif #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 * u_char *
ngx_http_time(u_char *buf, time_t t) ngx_http_time(u_char *buf, time_t t)
{ {

View File

@ -20,7 +20,8 @@ typedef struct {
void ngx_time_init(void); 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_time(u_char *buf, time_t t);
u_char *ngx_http_cookie_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); void ngx_gmtime(time_t t, ngx_tm_t *tp);

View File

@ -372,7 +372,7 @@ ngx_devpoll_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
err = (events == -1) ? ngx_errno : 0; err = (events == -1) ? ngx_errno : 0;
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
ngx_time_update(0); ngx_time_update();
} }
if (err) { if (err) {

View 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; err = (events == -1) ? ngx_errno : 0;
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) {
ngx_time_update(0); ngx_time_update();
} }
if (err) { if (err) {

View File

@ -405,7 +405,7 @@ ngx_eventport_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
err = ngx_errno; err = ngx_errno;
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
if (n == -1) { 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++) { for (i = 0; i < events; i++) {
if (event_list[i].portev_source == PORT_SOURCE_TIMER) { if (event_list[i].portev_source == PORT_SOURCE_TIMER) {
ngx_time_update(0); ngx_time_update();
continue; continue;
} }

View File

@ -163,7 +163,7 @@ ngx_iocp_timer(void *data)
for ( ;; ) { for ( ;; ) {
Sleep(timer); Sleep(timer);
ngx_time_update(0); ngx_time_update();
#if 1 #if 1
ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer"); ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0, "timer");
#endif #endif
@ -258,7 +258,7 @@ ngx_int_t ngx_iocp_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
delta = ngx_current_msec; delta = ngx_current_msec;
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0, ngx_log_debug4(NGX_LOG_DEBUG_EVENT, cycle->log, 0,

View File

@ -538,7 +538,7 @@ ngx_kqueue_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
err = (events == -1) ? ngx_errno : 0; err = (events == -1) ? ngx_errno : 0;
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { 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, 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 (NGX_HAVE_TIMER_EVENT)
if (event_list[i].filter == EVFILT_TIMER) { if (event_list[i].filter == EVFILT_TIMER) {
ngx_time_update(0); ngx_time_update();
continue; continue;
} }

View 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; err = (ready == -1) ? ngx_errno : 0;
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { 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, ngx_log_debug2(NGX_LOG_DEBUG_EVENT, cycle->log, 0,

View 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); "rtsig signo:%d", signo);
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
if (err == NGX_EAGAIN) { 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); signo, si.si_fd, si.si_band);
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
rtscf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_rtsig_module); 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) { } else if (signo == SIGALRM) {
ngx_time_update(0); ngx_time_update();
return NGX_OK; return NGX_OK;
@ -671,7 +671,7 @@ ngx_rtsig_process_overflow(ngx_cycle_t *cycle, ngx_msec_t timer,
} }
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
ngx_log_error(NGX_LOG_ALERT, cycle->log, 0, ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,

View File

@ -263,7 +263,7 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
err = (ready == -1) ? ngx_errno : 0; err = (ready == -1) ? ngx_errno : 0;
if (flags & NGX_UPDATE_TIME || ngx_event_timer_alarm) { 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, ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,

View File

@ -269,7 +269,7 @@ ngx_select_process_events(ngx_cycle_t *cycle, ngx_msec_t timer,
err = (ready == -1) ? ngx_socket_errno : 0; err = (ready == -1) ? ngx_socket_errno : 0;
if (flags & NGX_UPDATE_TIME) { if (flags & NGX_UPDATE_TIME) {
ngx_time_update(0); ngx_time_update();
} }
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,

View File

@ -1216,7 +1216,7 @@ ngx_http_file_cache_manager_sleep(ngx_http_file_cache_t *cache)
if (cache->files++ > 100) { if (cache->files++ > 100) {
ngx_time_update(0); ngx_time_update();
elapsed = ngx_abs((ngx_msec_int_t) (ngx_current_msec - cache->last)); 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_msleep(200);
ngx_time_update(0); ngx_time_update();
} }
cache->last = ngx_current_msec; cache->last = ngx_current_msec;

View File

@ -317,7 +317,7 @@ ngx_signal_handler(int signo)
} }
} }
ngx_time_update(1); ngx_time_sigsafe_update();
action = ""; action = "";

View File

@ -168,7 +168,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
sigsuspend(&set); sigsuspend(&set);
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_EVENT, cycle->log, 0,
"wake up, sigio %i", sigio); "wake up, sigio %i", sigio);
@ -1342,7 +1342,7 @@ ngx_cache_manager_process_handler(ngx_event_t *ev)
next = (n <= next) ? n : next; 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) { if (path[i]->loader) {
path[i]->loader(path[i]->data); path[i]->loader(path[i]->data);
ngx_time_update(0); ngx_time_update();
} }
} }

View File

@ -85,7 +85,7 @@ ngx_spawn_process(ngx_cycle_t *cycle, char *name, ngx_int_t respawn)
rc = WaitForMultipleObjects(2, events, 0, 5000); rc = WaitForMultipleObjects(2, events, 0, 5000);
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
"WaitForMultipleObjects: %ul", rc); "WaitForMultipleObjects: %ul", rc);

View File

@ -140,7 +140,7 @@ ngx_master_process_cycle(ngx_cycle_t *cycle)
ev = WaitForMultipleObjects(nev, events, 0, timeout); ev = WaitForMultipleObjects(nev, events, 0, timeout);
err = ngx_errno; err = ngx_errno;
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
"master WaitForMultipleObjects: %ul", ev); "master WaitForMultipleObjects: %ul", ev);
@ -679,7 +679,7 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)
ev = WaitForMultipleObjects(3, events, 0, INFINITE); ev = WaitForMultipleObjects(3, events, 0, INFINITE);
err = ngx_errno; err = ngx_errno;
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
"worker WaitForMultipleObjects: %ul", ev); "worker WaitForMultipleObjects: %ul", ev);
@ -738,7 +738,7 @@ ngx_worker_process_cycle(ngx_cycle_t *cycle, char *mevn)
ev = WaitForMultipleObjects(nev, events, 0, INFINITE); ev = WaitForMultipleObjects(nev, events, 0, INFINITE);
err = ngx_errno; err = ngx_errno;
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, log, 0,
"worker exit WaitForMultipleObjects: %ul", ev); "worker exit WaitForMultipleObjects: %ul", ev);
@ -907,7 +907,7 @@ ngx_cache_manager_thread(void *data)
ev = WaitForMultipleObjects(2, events, 0, INFINITE); ev = WaitForMultipleObjects(2, events, 0, INFINITE);
err = ngx_errno; err = ngx_errno;
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,
"cache manager WaitForMultipleObjects: %ul", ev); "cache manager WaitForMultipleObjects: %ul", ev);
@ -968,7 +968,7 @@ ngx_cache_manager_process_handler(void)
next = (n <= next) ? n : next; 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) { if (ev != WAIT_TIMEOUT) {
ngx_time_update(0); ngx_time_update();
ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
"cache manager WaitForSingleObject: %ul", ev); "cache manager WaitForSingleObject: %ul", ev);
@ -1008,7 +1008,7 @@ ngx_cache_loader_thread(void *data)
if (path[i]->loader) { if (path[i]->loader) {
path[i]->loader(path[i]->data); path[i]->loader(path[i]->data);
ngx_time_update(0); ngx_time_update();
} }
} }