diff --git a/src/timer.c b/src/timer.c index 67939ad..8e41f14 100644 --- a/src/timer.c +++ b/src/timer.c @@ -1,9 +1,10 @@ #include +#include #include "timer.h" -#define GIGA 1e9 +#define GIGA 1000000000 -#if defined(__unix__) +#if defined(__unix__) && !defined(__CYGWIN__) # ifdef CLOCK_MONOTONIC_RAW # define CLOCK CLOCK_MONOTONIC_RAW @@ -16,14 +17,14 @@ extern __attribute__ ((weak)) int clock_gettime(clockid_t, struct timespec *); #elif defined(__APPLE__) # include # include -#elif defined(_WIN32) +#elif defined(_WIN32) || defined(__CYGWIN__) # define VC_EXTRALEAN # define WIN32_LEAN_AND_MEAN # include #endif bool can_measure_time(void) { -#ifdef __unix__ +#if defined(__unix__) && !defined(__CYGWIN__) return clock_gettime != NULL; #else return true; @@ -41,13 +42,16 @@ int gettime_compat(struct timespec_compat *ts) { *ts = (struct timespec_compat) { mts->tv_sec, mts->tv_nsec }; return res > 0 ? -1 : 0; -#elif defined(_WIN32) +#elif defined(_WIN32) || defined(__CYGWIN__) LARGE_INTEGER freq, count; if (!QueryPerformanceFrequency(&freq) || !QueryPerformanceCounter(&count)) return -1; - *ts = (struct timespec_compat) { count / freq, count * (GIGA - 1) / freq }; + int64_t sec = count.QuadPart / freq.QuadPart; + int64_t nano = (int64_t) ((double) count.QuadPart * GIGA / (double) freq.QuadPart) % GIGA; + + *ts = (struct timespec_compat) { sec, nano }; return 0; #elif defined(__unix__) if (!can_measure_time()) { @@ -74,6 +78,6 @@ int timer_end(double *time, struct timespec_compat *state) { if (gettime_compat(&last) == -1) return 0; - *time = (last.tv_sec - state->tv_sec) + (last.tv_nsec - state->tv_nsec) / GIGA; + *time = (last.tv_sec - state->tv_sec) + (last.tv_nsec - state->tv_nsec) / (double) GIGA; return 1; }