xref: /aosp_15_r20/external/mesa3d/src/c11/time.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2022 Yonggang Luo
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  *
5*61046927SAndroid Build Coastguard Worker  * C11 <time.h> emulation library
6*61046927SAndroid Build Coastguard Worker  */
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #ifndef C11_TIME_H_INCLUDED_
9*61046927SAndroid Build Coastguard Worker #define C11_TIME_H_INCLUDED_
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include <time.h>
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker /*---------------------------- macros ---------------------------*/
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker /* Refer to https://htmlpreview.github.io/?https://icube-forge.unistra.fr/icps/c23-library/-/raw/main/README.html#time_monotonic-time_active-time_thread_active */
16*61046927SAndroid Build Coastguard Worker #if defined(TIME_UTC) && \
17*61046927SAndroid Build Coastguard Worker    defined(TIME_MONOTONIC) && \
18*61046927SAndroid Build Coastguard Worker    defined(TIME_ACTIVE) && \
19*61046927SAndroid Build Coastguard Worker    defined(TIME_THREAD_ACTIVE) && \
20*61046927SAndroid Build Coastguard Worker    defined(TIME_MONOTONIC_RAW)
21*61046927SAndroid Build Coastguard Worker /* all needed time base is implemented */
22*61046927SAndroid Build Coastguard Worker #else
23*61046927SAndroid Build Coastguard Worker #define _TIMESPEC_GET_NEED_IMPL
24*61046927SAndroid Build Coastguard Worker #endif
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker #ifdef _TIMESPEC_GET_NEED_IMPL
27*61046927SAndroid Build Coastguard Worker #undef TIME_UTC
28*61046927SAndroid Build Coastguard Worker #undef TIME_MONOTONIC
29*61046927SAndroid Build Coastguard Worker #undef TIME_ACTIVE
30*61046927SAndroid Build Coastguard Worker #undef TIME_THREAD_ACTIVE
31*61046927SAndroid Build Coastguard Worker #undef TIME_MONOTONIC_RAW
32*61046927SAndroid Build Coastguard Worker /* c11 */
33*61046927SAndroid Build Coastguard Worker #define TIME_UTC 1
34*61046927SAndroid Build Coastguard Worker /* c23 */
35*61046927SAndroid Build Coastguard Worker #define TIME_MONOTONIC 2
36*61046927SAndroid Build Coastguard Worker #define TIME_ACTIVE 3
37*61046927SAndroid Build Coastguard Worker #define TIME_THREAD_ACTIVE 4
38*61046927SAndroid Build Coastguard Worker #define TIME_MONOTONIC_RAW 5
39*61046927SAndroid Build Coastguard Worker #define timespec_get c23_timespec_get
40*61046927SAndroid Build Coastguard Worker #endif
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
43*61046927SAndroid Build Coastguard Worker extern "C" {
44*61046927SAndroid Build Coastguard Worker #endif
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker /*---------------------------- types ----------------------------*/
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker /*
49*61046927SAndroid Build Coastguard Worker  * On MINGW `struct timespec` present but `timespec_get` may not present;
50*61046927SAndroid Build Coastguard Worker  * On MSVC `struct timespec` and `timespec_get` present at the same time;
51*61046927SAndroid Build Coastguard Worker  * So detecting `HAVE_STRUCT_TIMESPEC` in meson script dynamically.
52*61046927SAndroid Build Coastguard Worker  */
53*61046927SAndroid Build Coastguard Worker #ifndef HAVE_STRUCT_TIMESPEC
54*61046927SAndroid Build Coastguard Worker struct timespec
55*61046927SAndroid Build Coastguard Worker {
56*61046927SAndroid Build Coastguard Worker     time_t tv_sec;  // Seconds - >= 0
57*61046927SAndroid Build Coastguard Worker     long   tv_nsec; // Nanoseconds - [0, 999999999]
58*61046927SAndroid Build Coastguard Worker };
59*61046927SAndroid Build Coastguard Worker #endif
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker /*-------------------------- functions --------------------------*/
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker #if defined(_TIMESPEC_GET_NEED_IMPL)
64*61046927SAndroid Build Coastguard Worker #define _TIMESPEC_GET_NEED_DECL
65*61046927SAndroid Build Coastguard Worker #elif defined(__APPLE__) && defined(__cplusplus) && (__cplusplus < 201703L)
66*61046927SAndroid Build Coastguard Worker /* On macOS, the guard for declaration of timespec_get is by
67*61046927SAndroid Build Coastguard Worker  * (defined(__cplusplus) && __cplusplus >= 201703L),
68*61046927SAndroid Build Coastguard Worker  * fix the declaration for C++14 and lower here
69*61046927SAndroid Build Coastguard Worker  */
70*61046927SAndroid Build Coastguard Worker #define _TIMESPEC_GET_NEED_DECL
71*61046927SAndroid Build Coastguard Worker #endif
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker #ifdef _TIMESPEC_GET_NEED_DECL
74*61046927SAndroid Build Coastguard Worker /*-------------------- 7.25.7 Time functions --------------------*/
75*61046927SAndroid Build Coastguard Worker // 7.25.6.1
76*61046927SAndroid Build Coastguard Worker int
77*61046927SAndroid Build Coastguard Worker timespec_get(struct timespec *ts, int base);
78*61046927SAndroid Build Coastguard Worker #undef _TIMESPEC_GET_NEED_DECL
79*61046927SAndroid Build Coastguard Worker #endif
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
82*61046927SAndroid Build Coastguard Worker }
83*61046927SAndroid Build Coastguard Worker #endif
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker #endif /* C11_TIME_H_INCLUDED_ */
86