#include <ngx_config.h> | |
#include <ngx_time.h> | |
void ngx_localtime(ngx_tm_t *tm) | |
{ | |
time_t clock = time(NULL); | |
localtime_r(&clock, tm); | |
tm->ngx_tm_mon++; | |
tm->ngx_tm_year += 1900; | |
} | |
u_int ngx_msec(void) | |
{ | |
struct timeval tv; | |
gettimeofday(&tv, NULL); | |
return tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
} | |
#if 0 | |
typedef struct { | |
int busy; | |
u_int_64 msec; | |
time_t sec; | |
tm; | |
http_time_len; | |
http_time[n]; | |
}; | |
volatile *ngx_time_p; | |
ngx_time() | |
{ | |
p = ngx_time_p; | |
} | |
ngx_update_time() | |
{ | |
u_int64 msec; | |
struct timeval tv; | |
gettimeofday(&tv, NULL); | |
msec = (unsigned long) tv.tv_sec * 1000 + tv.tv_usec / 1000; | |
p = ngx_time_p; | |
/* minimum can be for example 0, 10, 50 or 100 ms */ | |
if (tv_sec > p->sec || msec - p->msec >= minimum) { | |
old_p = p; | |
/* max_tries < max_slots - 10, | |
max_slots should be more than max of threads */ | |
for (/* void */; i < max_tries; i++) { | |
if (++p >= last_slot) | |
p = first_slot; | |
if (!test_and_set(p->busy) | |
break; | |
} | |
if (i == max_tries) { | |
ngx_log_error(); | |
return; | |
} | |
if (tv_sec > p->sec) { | |
p->sec = tv.tv.sec; | |
p->msec = msec; | |
localtime_r(&tv.tv_sec, tm); | |
make http stirng; | |
} else { | |
ngx_memcpy(p->sec, old_p->sec, sizeof() - offset_of(, sec)); | |
p->msec = msec; | |
} | |
/* here can be too seldom and non-critical race condition */ | |
if (ngx_time_p == old_p) | |
ngx_time_p = p; | |
unlock(p->busy); | |
} | |
} | |
#endif |