Mercurial > hg > nginx-quic
comparison src/core/ngx_times.c @ 3587:e1409e56ba7c stable-0.7
merge r3473, r3474, r3385, r3386, r3537:
signal processing stability:
*) use sys_errlist[] in signal handler instead
of non Async-Signal-Safe strerror_r()
*) do not update time in the timer signal handler,
since localtime_r() is not Async-Signal-Safe function
*) 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
*) introduce ngx_time_sigsafe_update() to update the error log time only
*) change ngx_time_update() interface
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 07 Jun 2010 10:35:08 +0000 |
parents | bf38420c9e25 |
children |
comparison
equal
deleted
inserted
replaced
3586:2d21e02fc01d | 3587:e1409e56ba7c |
---|---|
26 volatile ngx_time_t *ngx_cached_time; | 26 volatile ngx_time_t *ngx_cached_time; |
27 volatile ngx_str_t ngx_cached_err_log_time; | 27 volatile ngx_str_t ngx_cached_err_log_time; |
28 volatile ngx_str_t ngx_cached_http_time; | 28 volatile ngx_str_t ngx_cached_http_time; |
29 volatile ngx_str_t ngx_cached_http_log_time; | 29 volatile ngx_str_t ngx_cached_http_log_time; |
30 | 30 |
31 #if !(NGX_WIN32) | |
32 | |
33 /* | |
34 * locatime() and localtime_r() are not Async-Signal-Safe functions, therefore, | |
35 * they must not be called by a signal handler, so we use the cached | |
36 * GMT offset value. Fortunately the value is changed only two times a year. | |
37 */ | |
38 | |
39 static ngx_int_t cached_gmtoff; | |
40 #endif | |
41 | |
31 static ngx_time_t cached_time[NGX_TIME_SLOTS]; | 42 static ngx_time_t cached_time[NGX_TIME_SLOTS]; |
32 static u_char cached_err_log_time[NGX_TIME_SLOTS] | 43 static u_char cached_err_log_time[NGX_TIME_SLOTS] |
33 [sizeof("1970/09/28 12:00:00")]; | 44 [sizeof("1970/09/28 12:00:00")]; |
34 static u_char cached_http_time[NGX_TIME_SLOTS] | 45 static u_char cached_http_time[NGX_TIME_SLOTS] |
35 [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")]; | 46 [sizeof("Mon, 28 Sep 1970 06:00:00 GMT")]; |
48 ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; | 59 ngx_cached_http_time.len = sizeof("Mon, 28 Sep 1970 06:00:00 GMT") - 1; |
49 ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; | 60 ngx_cached_http_log_time.len = sizeof("28/Sep/1970:12:00:00 +0600") - 1; |
50 | 61 |
51 ngx_cached_time = &cached_time[0]; | 62 ngx_cached_time = &cached_time[0]; |
52 | 63 |
53 ngx_time_update(0, 0); | 64 ngx_time_update(); |
54 } | 65 } |
55 | 66 |
56 | 67 |
57 void | 68 void |
58 ngx_time_update(time_t sec, ngx_uint_t msec) | 69 ngx_time_update(void) |
59 { | 70 { |
60 u_char *p0, *p1, *p2; | 71 u_char *p0, *p1, *p2; |
61 ngx_tm_t tm, gmt; | 72 ngx_tm_t tm, gmt; |
73 time_t sec; | |
74 ngx_uint_t msec; | |
62 ngx_time_t *tp; | 75 ngx_time_t *tp; |
63 struct timeval tv; | 76 struct timeval tv; |
64 | 77 |
65 if (!ngx_trylock(&ngx_time_lock)) { | 78 if (!ngx_trylock(&ngx_time_lock)) { |
66 return; | 79 return; |
67 } | 80 } |
68 | 81 |
69 if (sec == 0) { | 82 ngx_gettimeofday(&tv); |
70 ngx_gettimeofday(&tv); | 83 |
71 | 84 sec = tv.tv_sec; |
72 sec = tv.tv_sec; | 85 msec = tv.tv_usec / 1000; |
73 msec = tv.tv_usec / 1000; | |
74 } | |
75 | 86 |
76 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec; | 87 ngx_current_msec = (ngx_msec_t) sec * 1000 + msec; |
77 | 88 |
78 tp = &cached_time[slot]; | 89 tp = &cached_time[slot]; |
79 | 90 |
110 ngx_gmtime(sec + tp->gmtoff * 60, &tm); | 121 ngx_gmtime(sec + tp->gmtoff * 60, &tm); |
111 | 122 |
112 #elif (NGX_HAVE_GMTOFF) | 123 #elif (NGX_HAVE_GMTOFF) |
113 | 124 |
114 ngx_localtime(sec, &tm); | 125 ngx_localtime(sec, &tm); |
115 tp->gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); | 126 cached_gmtoff = (ngx_int_t) (tm.ngx_tm_gmtoff / 60); |
127 tp->gmtoff = cached_gmtoff; | |
116 | 128 |
117 #else | 129 #else |
118 | 130 |
119 ngx_localtime(sec, &tm); | 131 ngx_localtime(sec, &tm); |
120 tp->gmtoff = ngx_timezone(tm.ngx_tm_isdst); | 132 cached_gmtoff = ngx_timezone(tm.ngx_tm_isdst); |
133 tp->gmtoff = cached_gmtoff; | |
121 | 134 |
122 #endif | 135 #endif |
123 | 136 |
124 | 137 |
125 p1 = &cached_err_log_time[slot][0]; | 138 p1 = &cached_err_log_time[slot][0]; |
147 ngx_cached_err_log_time.data = p1; | 160 ngx_cached_err_log_time.data = p1; |
148 ngx_cached_http_log_time.data = p2; | 161 ngx_cached_http_log_time.data = p2; |
149 | 162 |
150 ngx_unlock(&ngx_time_lock); | 163 ngx_unlock(&ngx_time_lock); |
151 } | 164 } |
165 | |
166 | |
167 #if !(NGX_WIN32) | |
168 | |
169 void | |
170 ngx_time_sigsafe_update(void) | |
171 { | |
172 u_char *p; | |
173 ngx_tm_t tm; | |
174 time_t sec; | |
175 ngx_time_t *tp; | |
176 struct timeval tv; | |
177 | |
178 if (!ngx_trylock(&ngx_time_lock)) { | |
179 return; | |
180 } | |
181 | |
182 ngx_gettimeofday(&tv); | |
183 | |
184 sec = tv.tv_sec; | |
185 | |
186 tp = &cached_time[slot]; | |
187 | |
188 if (tp->sec == sec) { | |
189 ngx_unlock(&ngx_time_lock); | |
190 return; | |
191 } | |
192 | |
193 if (slot == NGX_TIME_SLOTS - 1) { | |
194 slot = 0; | |
195 } else { | |
196 slot++; | |
197 } | |
198 | |
199 ngx_gmtime(sec + cached_gmtoff * 60, &tm); | |
200 | |
201 p = &cached_err_log_time[slot][0]; | |
202 | |
203 (void) ngx_sprintf(p, "%4d/%02d/%02d %02d:%02d:%02d", | |
204 tm.ngx_tm_year, tm.ngx_tm_mon, | |
205 tm.ngx_tm_mday, tm.ngx_tm_hour, | |
206 tm.ngx_tm_min, tm.ngx_tm_sec); | |
207 | |
208 ngx_memory_barrier(); | |
209 | |
210 ngx_cached_err_log_time.data = p; | |
211 | |
212 ngx_unlock(&ngx_time_lock); | |
213 } | |
214 | |
215 #endif | |
152 | 216 |
153 | 217 |
154 u_char * | 218 u_char * |
155 ngx_http_time(u_char *buf, time_t t) | 219 ngx_http_time(u_char *buf, time_t t) |
156 { | 220 { |