28#define WIN32_LEAN_AND_MEAN
41#if defined(__MINGW32__)
49#if !defined(_TIMESPEC_DEFINED) && !defined(__struct_timespec_defined) \
55#define _TIMESPEC_DEFINED
58#ifndef CLOCK_MONOTONIC
59#define CLOCK_MONOTONIC 1
62#define CLOCK_REALTIME 0
68static inline int clock_gettime(
int clk_id,
struct timespec *tp) {
69 if (clk_id == CLOCK_MONOTONIC) {
70 LARGE_INTEGER counter, frequency;
71 QueryPerformanceCounter(&counter);
72 QueryPerformanceFrequency(&frequency);
73 long long secs = counter.QuadPart / frequency.QuadPart;
74 long long rem = counter.QuadPart % frequency.QuadPart;
76 tp->tv_nsec = (long)((rem * 1000000000LL) / frequency.QuadPart);
78 }
else if (clk_id == CLOCK_REALTIME) {
80 GetSystemTimePreciseAsFileTime(&ft);
81 unsigned long long t =
82 ((
unsigned long long)ft.dwHighDateTime << 32) | ft.dwLowDateTime;
83 if (t < 116444736000000000ULL) { tp->tv_sec = 0; tp->tv_nsec = 0;
return 0; }
84 unsigned long long ns_epoch = (t - 116444736000000000ULL) * 100ULL;
85 tp->tv_sec = (
long long)(ns_epoch / 1000000000ULL);
86 tp->tv_nsec = (long)(ns_epoch % 1000000000ULL);
96static inline uint64_t lime_now_ns(
void) {
98 LARGE_INTEGER counter, frequency;
99 QueryPerformanceCounter(&counter);
100 QueryPerformanceFrequency(&frequency);
103 uint64_t secs = (uint64_t)counter.QuadPart / (uint64_t)frequency.QuadPart;
104 uint64_t rem = (uint64_t)counter.QuadPart % (uint64_t)frequency.QuadPart;
105 return secs * 1000000000ULL
106 + (rem * 1000000000ULL) / (uint64_t)frequency.QuadPart;
109 clock_gettime(CLOCK_MONOTONIC, &ts);
110 return (uint64_t)ts.tv_sec * 1000000000ULL + (uint64_t)ts.tv_nsec;
114static inline uint64_t lime_now_realtime_ns(
void) {
120 GetSystemTimePreciseAsFileTime(&ft);
121 uint64_t t = ((uint64_t)ft.dwHighDateTime << 32) | ft.dwLowDateTime;
122 if (t < 116444736000000000ULL)
return 0;
123 return (t - 116444736000000000ULL) * 100ULL;
126 if (clock_gettime(CLOCK_REALTIME, &ts) != 0)
return 0;
127 return (uint64_t)ts.tv_sec * 1000000000ULL + (uint64_t)ts.tv_nsec;
144#if defined(__GNUC__) || defined(__clang__)
145#define LIME_USE(x) __asm__ volatile("" : : "r"(x))
146#elif defined(_MSC_VER)
147#define LIME_USE(x) do { volatile long long _lime_use_sink = (long long)(x); \
148 (void)_lime_use_sink; } while (0)
150#define LIME_USE(x) ((void)(x))
166#if defined(__GNUC__) || defined(__clang__)
167#define LIME_LIKELY(x) __builtin_expect(!!(x), 1)
168#define LIME_UNLIKELY(x) __builtin_expect(!!(x), 0)
170#define LIME_LIKELY(x) (x)
171#define LIME_UNLIKELY(x) (x)
186#if defined(__GNUC__) || defined(__clang__)
187#define LIME_HOT __attribute__((hot))
188#define LIME_COLD __attribute__((cold))
203#if defined(__GNUC__) || defined(__clang__)
204#define LIME_RESTRICT __restrict__
205#elif defined(_MSC_VER)
206#define LIME_RESTRICT __restrict