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