#define _POSIX_C_SOURCE 200112L #include "../CgeTimer.h" #include #include #include #include enum Type { TYPE_UNDEFINED, TYPE_OLD_REALTIME, TYPE_NEW_REALTIME, TYPE_MONOTONIC }; static int timerType = TYPE_UNDEFINED; static int checkAvailableTimer(void) { #if (_POSIX_TIMERS > 0) struct timespec ts; #endif if (timerType != TYPE_UNDEFINED) return timerType; #if (_POSIX_TIMERS > 0) if (!clock_gettime(CLOCK_MONOTONIC, &ts)) { timerType = TYPE_MONOTONIC; } else if (!clock_gettime(CLOCK_REALTIME, &ts)) { timerType = TYPE_NEW_REALTIME; } else #endif timerType = TYPE_OLD_REALTIME; return timerType; } static void getTimer(uint64_t *sec, uint64_t *nsec) { #if (_POSIX_TIMERS > 0) struct timespec ts; #endif struct timeval tv; switch (checkAvailableTimer()) { #if (_POSIX_TIMERS > 0) case TYPE_MONOTONIC: clock_gettime(CLOCK_MONOTONIC, &ts); *sec = ts.tv_sec; *nsec = ts.tv_nsec; break; case TYPE_NEW_REALTIME: clock_gettime(CLOCK_REALTIME, &ts); *sec = ts.tv_sec; *nsec = ts.tv_nsec; break; #endif default: case TYPE_OLD_REALTIME: gettimeofday(&tv, NULL); *sec = tv.tv_sec; *nsec = tv.tv_usec * (uint64_t)1000; break; } } int CgeTimerIsMonotonic(void) { return checkAvailableTimer() == TYPE_MONOTONIC; } uint64_t CgeTimerMilliseconds(void) { uint64_t newSec, newNsec; getTimer(&newSec, &newNsec); return (newSec * 1000u) + (newNsec / 1000000ul); } uint64_t CgeTimerNanoseconds(void) { uint64_t newSec, newNsec; getTimer(&newSec, &newNsec); return (newSec * 1000000000ul) + newNsec; }