mesa/src/c11/time.h
Yonggang Luo 66a99f619f c11: Improve timespec_get to support TIME_MONOTONIC TIME_ACTIVE TIME_THREAD_ACTIVE TIME_MONOTONIC_RAW
As c11 already provided timespec_get, to avoid symbol conflict, use c23_timespec_get as the function name
and define timespec_get c23_timespec_get to achieve that

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Reviewed-by: Jesse Natalie <jenatali@microsoft.com>
Acked-by: David Heidelberg <david.heidelberg@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23733>
2023-06-20 00:05:48 +00:00

85 lines
2.1 KiB
C++

/*
* Copyright 2022 Yonggang Luo
* SPDX-License-Identifier: MIT
*
* C11 <time.h> emulation library
*/
#ifndef C11_TIME_H_INCLUDED_
#define C11_TIME_H_INCLUDED_
#include <time.h>
/*---------------------------- macros ---------------------------*/
/* 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 */
#if defined(TIME_UTC) && \
defined(TIME_MONOTONIC) && \
defined(TIME_ACTIVE) && \
defined(TIME_THREAD_ACTIVE) && \
defined(TIME_MONOTONIC_RAW)
/* all needed time base is implemented */
#else
#define _TIMESPEC_GET_NEED_IMPL
#endif
#ifdef _TIMESPEC_GET_NEED_IMPL
#undef TIME_UTC
#undef TIME_MONOTONIC
#undef TIME_ACTIVE
#undef TIME_THREAD_ACTIVE
#undef TIME_MONOTONIC_RAW
/* c11 */
#define TIME_UTC 1
/* c23 */
#define TIME_MONOTONIC 2
#define TIME_ACTIVE 3
#define TIME_THREAD_ACTIVE 4
#define TIME_MONOTONIC_RAW 5
#define timespec_get c23_timespec_get
#endif
#ifdef __cplusplus
extern "C" {
#endif
/*---------------------------- types ----------------------------*/
/*
* On MINGW `struct timespec` present but `timespec_get` may not present;
* On MSVC `struct timespec` and `timespec_get` present at the same time;
* So detecting `HAVE_STRUCT_TIMESPEC` in meson script dynamically.
*/
#ifndef HAVE_STRUCT_TIMESPEC
struct timespec
{
time_t tv_sec; // Seconds - >= 0
long tv_nsec; // Nanoseconds - [0, 999999999]
};
#endif
/*-------------------------- functions --------------------------*/
#if defined(_TIMESPEC_GET_NEED_IMPL)
#define _TIMESPEC_GET_NEED_DECL
#elif defined(__APPLE__) && defined(__cplusplus) && (__cplusplus < 201703L)
/* On macOS, the guard for declaration of timespec_get is by
* (defined(__cplusplus) && __cplusplus >= 201703L),
* fix the declaration for C++14 and lower here
*/
#define _TIMESPEC_GET_NEED_DECL
#endif
#ifdef _TIMESPEC_GET_NEED_DECL
/*-------------------- 7.25.7 Time functions --------------------*/
// 7.25.6.1
int
timespec_get(struct timespec *ts, int base);
#undef _TIMESPEC_GET_NEED_DECL
#endif
#ifdef __cplusplus
}
#endif
#endif /* C11_TIME_H_INCLUDED_ */