nuclear@0: #include "timer.h" nuclear@0: nuclear@0: #if defined(__APPLE__) && !defined(__unix__) nuclear@0: #define __unix__ nuclear@0: #endif nuclear@0: nuclear@0: #ifdef __unix__ nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #ifdef CLOCK_MONOTONIC nuclear@0: unsigned long get_time_msec(void) nuclear@0: { nuclear@0: struct timespec ts; nuclear@0: static struct timespec ts0; nuclear@0: nuclear@0: clock_gettime(CLOCK_MONOTONIC, &ts); nuclear@0: if(ts0.tv_sec == 0 && ts0.tv_nsec == 0) { nuclear@0: ts0 = ts; nuclear@0: return 0; nuclear@0: } nuclear@0: return (ts.tv_sec - ts0.tv_sec) * 1000 + (ts.tv_nsec - ts0.tv_nsec) / 1000000; nuclear@0: } nuclear@0: #else /* no fancy POSIX clocks, fallback to good'ol gettimeofday */ nuclear@0: unsigned long get_time_msec(void) nuclear@0: { nuclear@0: struct timeval tv; nuclear@0: static struct timeval tv0; nuclear@0: nuclear@0: gettimeofday(&tv, 0); nuclear@0: if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { nuclear@0: tv0 = tv; nuclear@0: return 0; nuclear@0: } nuclear@0: return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; nuclear@0: } nuclear@0: #endif /* !posix clock */ nuclear@0: nuclear@0: void sleep_msec(unsigned long msec) nuclear@0: { nuclear@0: usleep(msec * 1000); nuclear@0: } nuclear@0: #endif nuclear@0: nuclear@0: #ifdef WIN32 nuclear@0: #include nuclear@0: #pragma comment(lib, "winmm.lib") nuclear@0: nuclear@0: unsigned long get_time_msec(void) nuclear@0: { nuclear@0: return timeGetTime(); nuclear@0: } nuclear@0: nuclear@0: void sleep_msec(unsigned long msec) nuclear@0: { nuclear@0: Sleep(msec); nuclear@0: } nuclear@0: #endif nuclear@0: nuclear@0: double get_time_sec(void) nuclear@0: { nuclear@0: return get_time_msec() / 1000.0f; nuclear@0: } nuclear@0: nuclear@0: void sleep_sec(double sec) nuclear@0: { nuclear@0: if(sec > 0.0f) { nuclear@0: sleep_msec(sec * 1000.0f); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: nuclear@0: Timer::Timer() nuclear@0: { nuclear@0: reset(); nuclear@0: } nuclear@0: nuclear@0: void Timer::reset() nuclear@0: { nuclear@0: pause_time = 0; nuclear@0: start_time = get_time_msec(); nuclear@0: } nuclear@0: nuclear@0: void Timer::start() nuclear@0: { nuclear@0: if(!is_running()) { nuclear@0: // resuming nuclear@0: start_time += get_time_msec() - pause_time; nuclear@0: pause_time = 0; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: void Timer::stop() nuclear@0: { nuclear@0: if(is_running()) { nuclear@0: pause_time = get_time_msec(); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: bool Timer::is_running() const nuclear@0: { nuclear@0: return pause_time == 0; nuclear@0: } nuclear@0: nuclear@0: unsigned long Timer::get_msec() const nuclear@0: { nuclear@0: if(!is_running()) { nuclear@0: // in paused state... nuclear@0: return pause_time - start_time; nuclear@0: } nuclear@0: return get_time_msec() - start_time; nuclear@0: } nuclear@0: nuclear@0: double Timer::get_sec() const nuclear@0: { nuclear@0: return (double)get_msec() / 1000.0; nuclear@0: }