-#ifndef _WIN32
-
-/* Timing abstraction */
-
-struct time {
- struct timeval tv;
-};
-
-#define TIME_ZERO {.tv = {0, 0}}
-#define TIME_MS(ms) {.tv = {ms / 1000, (ms % 1000) * 1000}}
-
-static void time_get(struct time *time)
-{
-#ifdef HAVE_CLOCK_GETTIME
- struct timespec ts;
- if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1)
- clock_gettime(CLOCK_REALTIME, &ts);
- time->tv.tv_sec = ts.tv_sec;
- time->tv.tv_usec = ts.tv_nsec / 1000;
-#elif defined(__APPLE__)
- mach_timebase_info_data_t info;
- mach_timebase_info(&info);
- uint64_t ticks = mach_absolute_time();
- uint64_t ns = (ticks * info.numer) / info.denom;
- time->tv.tv_sec = ns / 1000000000;
- time->tv.tv_usec = (ns % 1000000000) / 1000;
-#else
- gettimeofday(&time->tv, NULL);
-#endif
-}
-
-static void time_set_ms(struct time *time, unsigned int ms)
-{
- time->tv.tv_sec = ms / 1000;
- time->tv.tv_usec = (ms % 1000) * 1000;
-}
-
-static void time_add(const struct time *a,
- const struct time *b, struct time *result)
-{
- timeradd(&a->tv, &b->tv, &result->tv);
-}
-
-static void time_sub(const struct time *a,
- const struct time *b, struct time *result)
-{
- timersub(&a->tv, &b->tv, &result->tv);
-}
-
-static bool time_greater(const struct time *a, const struct time *b)
-{
- return timercmp(&a->tv, &b->tv, >);
-}
-
-static void time_as_timeval(const struct time *time, struct timeval *tv)
-{
- *tv = time->tv;
-}
-
-static unsigned int time_as_ms(const struct time *time)
-{
- return time->tv.tv_sec * 1000 + time->tv.tv_usec / 1000;
-}
-
-#endif
-