/*** Clock ***/ mtime_t mdate (void) { #if (_WIN32_WINNT >= 0x0601) ULONGLONG ts; if (unlikely(!QueryUnbiasedInterruptTime (&ts))) abort (); /* hundreds of nanoseconds */ static_assert ((10000000 % CLOCK_FREQ) == 0, "Broken frequencies ratio"); return ts / (10000000 / CLOCK_FREQ); #elif (_WIN32_WINNT >= 0x0600) ULONGLONG ts = GetTickCount64 (); /* milliseconds */ static_assert ((CLOCK_FREQ % 1000) == 0, "Broken frequencies ratio"); return ts * (CLOCK_FREQ / 1000); #else /* We don't need the real date, just the value of a high precision timer */ LARGE_INTEGER counter; if (!QueryPerformanceCounter (&counter)) abort (); /* Convert to from (1/freq) to microsecond resolution */ /* We need to split the division to avoid 63-bits overflow */ lldiv_t d = lldiv (counter.QuadPart, freq.QuadPart); return (d.quot * 1000000) + ((d.rem * 1000000) / freq.QuadPart); #endif }
static mtime_t mdate_interrupt (void) { ULONGLONG ts; BOOL ret; #if (_WIN32_WINNT >= 0x0601) ret = QueryUnbiasedInterruptTime (&ts); #else ret = clk.interrupt.query (&ts); #endif if (unlikely(!ret)) abort (); /* hundreds of nanoseconds */ static_assert ((10000000 % CLOCK_FREQ) == 0, "Broken frequencies ratio"); return ts / (10000000 / CLOCK_FREQ); }
/*** Clock ***/ mtime_t mdate (void) { #if (_WIN32_WINNT >= 0x0601) ULONGLONG ts; if (unlikely(!QueryUnbiasedInterruptTime (&ts))) abort (); return ts / 10; /* hundreds of nanoseconds */ #else /* We don't need the real date, just the value of a high precision timer */ LARGE_INTEGER counter; if (!QueryPerformanceCounter (&counter)) abort (); /* Convert to from (1/freq) to microsecond resolution */ /* We need to split the division to avoid 63-bits overflow */ lldiv_t d = lldiv (counter.QuadPart, freq.QuadPart); return (d.quot * 1000000) + ((d.rem * 1000000) / freq.QuadPart); #endif }