xref: /unit/src/nxt_thread_time.h (revision 2084:7d479274f334)
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