
#include <ngx_config.h>
#include <ngx_time.h>

void ngx_localtime(ngx_tm_t *tm)
{
    time_t clock = time(NULL);
    localtime_r(&clock, tm);
}

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
