10Sigor@sysoev.ru 20Sigor@sysoev.ru /* 30Sigor@sysoev.ru * Copyright (C) Igor Sysoev 40Sigor@sysoev.ru * Copyright (C) NGINX, Inc. 50Sigor@sysoev.ru */ 60Sigor@sysoev.ru 70Sigor@sysoev.ru #ifndef _NXT_THREAD_TIME_H_INCLUDED_ 80Sigor@sysoev.ru #define _NXT_THREAD_TIME_H_INCLUDED_ 90Sigor@sysoev.ru 100Sigor@sysoev.ru 110Sigor@sysoev.ru #define NXT_THREAD_TIME_LOCAL 0 120Sigor@sysoev.ru #define NXT_THREAD_TIME_GMT 1 130Sigor@sysoev.ru 140Sigor@sysoev.ru #define NXT_THREAD_TIME_SEC 0 150Sigor@sysoev.ru #define NXT_THREAD_TIME_MSEC 1 160Sigor@sysoev.ru 170Sigor@sysoev.ru 180Sigor@sysoev.ru typedef struct { 190Sigor@sysoev.ru nxt_atomic_t slot; 200Sigor@sysoev.ru u_char *(*handler)(u_char *buf, nxt_realtime_t *now, 210Sigor@sysoev.ru struct tm *tm, size_t size, 220Sigor@sysoev.ru const char *format); 230Sigor@sysoev.ru const char *format; 240Sigor@sysoev.ru size_t size; 250Sigor@sysoev.ru 260Sigor@sysoev.ru uint8_t timezone; /* 1 bit */ 270Sigor@sysoev.ru uint8_t msec; /* 1 bit */ 280Sigor@sysoev.ru } nxt_time_string_t; 290Sigor@sysoev.ru 300Sigor@sysoev.ru 310Sigor@sysoev.ru typedef struct { 320Sigor@sysoev.ru nxt_time_t last; 330Sigor@sysoev.ru #if (NXT_DEBUG) 340Sigor@sysoev.ru nxt_msec_t last_msec; 350Sigor@sysoev.ru #endif 360Sigor@sysoev.ru nxt_str_t string; 370Sigor@sysoev.ru } nxt_time_string_cache_t; 380Sigor@sysoev.ru 390Sigor@sysoev.ru 400Sigor@sysoev.ru typedef struct { 410Sigor@sysoev.ru nxt_monotonic_time_t now; 420Sigor@sysoev.ru 430Sigor@sysoev.ru nxt_time_t last_gmtime; 440Sigor@sysoev.ru nxt_time_t last_localtime; 450Sigor@sysoev.ru struct tm gmtime; 460Sigor@sysoev.ru struct tm localtime; 470Sigor@sysoev.ru 480Sigor@sysoev.ru uint32_t no_cache; /* 1 bit */ 490Sigor@sysoev.ru 500Sigor@sysoev.ru /* 510Sigor@sysoev.ru * The flag indicating a signal state of a thread. 520Sigor@sysoev.ru * It is used to handle local time of the thread: 530Sigor@sysoev.ru * -1 means that the thread never runs in a signal context; 540Sigor@sysoev.ru * 0 means that the thread may run in a signal context but not now; 550Sigor@sysoev.ru * >0 means that the thread runs in a signal context right now. 560Sigor@sysoev.ru */ 570Sigor@sysoev.ru nxt_atomic_int_t signal; 580Sigor@sysoev.ru 590Sigor@sysoev.ru nxt_atomic_uint_t nstrings; 600Sigor@sysoev.ru nxt_time_string_cache_t *strings; 610Sigor@sysoev.ru } nxt_thread_time_t; 620Sigor@sysoev.ru 630Sigor@sysoev.ru 640Sigor@sysoev.ru NXT_EXPORT void nxt_thread_time_update(nxt_thread_t *thr); 650Sigor@sysoev.ru void nxt_thread_time_free(nxt_thread_t *thr); 660Sigor@sysoev.ru NXT_EXPORT nxt_time_t nxt_thread_time(nxt_thread_t *thr); 670Sigor@sysoev.ru NXT_EXPORT nxt_realtime_t *nxt_thread_realtime(nxt_thread_t *thr); 680Sigor@sysoev.ru NXT_EXPORT u_char *nxt_thread_time_string(nxt_thread_t *thr, 690Sigor@sysoev.ru nxt_time_string_t *ts, u_char *buf); 70223Sigor@sysoev.ru void nxt_time_thread_start(nxt_msec_t interval); 710Sigor@sysoev.ru 720Sigor@sysoev.ru 73*2084Salx.manpages@gmail.com #define nxt_thread_monotonic_time(thr) \ 740Sigor@sysoev.ru (thr)->time.now.monotonic 750Sigor@sysoev.ru 760Sigor@sysoev.ru 770Sigor@sysoev.ru #if (NXT_DEBUG) 780Sigor@sysoev.ru 79*2084Salx.manpages@gmail.com #define nxt_thread_time_debug_update(thr) \ 800Sigor@sysoev.ru nxt_thread_time_update(thr) 810Sigor@sysoev.ru 820Sigor@sysoev.ru #else 830Sigor@sysoev.ru 84*2084Salx.manpages@gmail.com #define nxt_thread_time_debug_update(thr) 850Sigor@sysoev.ru 860Sigor@sysoev.ru #endif 870Sigor@sysoev.ru 880Sigor@sysoev.ru 890Sigor@sysoev.ru NXT_EXPORT void nxt_gmtime(nxt_time_t s, struct tm *tm); 900Sigor@sysoev.ru 910Sigor@sysoev.ru 920Sigor@sysoev.ru #endif /* _NXT_THREAD_TIME_H_INCLUDED_ */ 93