goat3dgfx
annotate src/timer.cc @ 34:3eb6c8f89fe1
merge
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 02 Mar 2014 17:41:10 +0200 |
parents | 1873dfd13f2d |
children |
rev | line source |
---|---|
nuclear@0 | 1 #include "timer.h" |
nuclear@0 | 2 |
nuclear@15 | 3 using namespace goatgfx; |
nuclear@15 | 4 |
nuclear@0 | 5 #if defined(__APPLE__) && !defined(__unix__) |
nuclear@0 | 6 #define __unix__ |
nuclear@0 | 7 #endif |
nuclear@0 | 8 |
nuclear@15 | 9 namespace goatgfx { |
nuclear@15 | 10 |
nuclear@0 | 11 #ifdef __unix__ |
nuclear@0 | 12 #include <time.h> |
nuclear@0 | 13 #include <unistd.h> |
nuclear@0 | 14 #include <sys/time.h> |
nuclear@0 | 15 |
nuclear@0 | 16 #ifdef CLOCK_MONOTONIC |
nuclear@0 | 17 unsigned long get_time_msec(void) |
nuclear@0 | 18 { |
nuclear@0 | 19 struct timespec ts; |
nuclear@0 | 20 static struct timespec ts0; |
nuclear@0 | 21 |
nuclear@0 | 22 clock_gettime(CLOCK_MONOTONIC, &ts); |
nuclear@0 | 23 if(ts0.tv_sec == 0 && ts0.tv_nsec == 0) { |
nuclear@0 | 24 ts0 = ts; |
nuclear@0 | 25 return 0; |
nuclear@0 | 26 } |
nuclear@0 | 27 return (ts.tv_sec - ts0.tv_sec) * 1000 + (ts.tv_nsec - ts0.tv_nsec) / 1000000; |
nuclear@0 | 28 } |
nuclear@0 | 29 #else /* no fancy POSIX clocks, fallback to good'ol gettimeofday */ |
nuclear@0 | 30 unsigned long get_time_msec(void) |
nuclear@0 | 31 { |
nuclear@0 | 32 struct timeval tv; |
nuclear@0 | 33 static struct timeval tv0; |
nuclear@0 | 34 |
nuclear@0 | 35 gettimeofday(&tv, 0); |
nuclear@0 | 36 if(tv0.tv_sec == 0 && tv0.tv_usec == 0) { |
nuclear@0 | 37 tv0 = tv; |
nuclear@0 | 38 return 0; |
nuclear@0 | 39 } |
nuclear@0 | 40 return (tv.tv_sec - tv0.tv_sec) * 1000 + (tv.tv_usec - tv0.tv_usec) / 1000; |
nuclear@0 | 41 } |
nuclear@0 | 42 #endif /* !posix clock */ |
nuclear@0 | 43 |
nuclear@0 | 44 void sleep_msec(unsigned long msec) |
nuclear@0 | 45 { |
nuclear@0 | 46 usleep(msec * 1000); |
nuclear@0 | 47 } |
nuclear@0 | 48 #endif |
nuclear@0 | 49 |
nuclear@0 | 50 #ifdef WIN32 |
nuclear@0 | 51 #include <windows.h> |
nuclear@0 | 52 #pragma comment(lib, "winmm.lib") |
nuclear@0 | 53 |
nuclear@0 | 54 unsigned long get_time_msec(void) |
nuclear@0 | 55 { |
nuclear@0 | 56 return timeGetTime(); |
nuclear@0 | 57 } |
nuclear@0 | 58 |
nuclear@0 | 59 void sleep_msec(unsigned long msec) |
nuclear@0 | 60 { |
nuclear@0 | 61 Sleep(msec); |
nuclear@0 | 62 } |
nuclear@0 | 63 #endif |
nuclear@0 | 64 |
nuclear@0 | 65 double get_time_sec(void) |
nuclear@0 | 66 { |
nuclear@0 | 67 return get_time_msec() / 1000.0f; |
nuclear@0 | 68 } |
nuclear@0 | 69 |
nuclear@0 | 70 void sleep_sec(double sec) |
nuclear@0 | 71 { |
nuclear@0 | 72 if(sec > 0.0f) { |
nuclear@0 | 73 sleep_msec(sec * 1000.0f); |
nuclear@0 | 74 } |
nuclear@0 | 75 } |
nuclear@0 | 76 |
nuclear@15 | 77 } // namespace goatgfx |
nuclear@15 | 78 |
nuclear@0 | 79 |
nuclear@0 | 80 Timer::Timer() |
nuclear@0 | 81 { |
nuclear@0 | 82 reset(); |
nuclear@0 | 83 } |
nuclear@0 | 84 |
nuclear@0 | 85 void Timer::reset() |
nuclear@0 | 86 { |
nuclear@0 | 87 pause_time = 0; |
nuclear@0 | 88 start_time = get_time_msec(); |
nuclear@0 | 89 } |
nuclear@0 | 90 |
nuclear@0 | 91 void Timer::start() |
nuclear@0 | 92 { |
nuclear@0 | 93 if(!is_running()) { |
nuclear@0 | 94 // resuming |
nuclear@0 | 95 start_time += get_time_msec() - pause_time; |
nuclear@0 | 96 pause_time = 0; |
nuclear@0 | 97 } |
nuclear@0 | 98 } |
nuclear@0 | 99 |
nuclear@0 | 100 void Timer::stop() |
nuclear@0 | 101 { |
nuclear@0 | 102 if(is_running()) { |
nuclear@0 | 103 pause_time = get_time_msec(); |
nuclear@0 | 104 } |
nuclear@0 | 105 } |
nuclear@0 | 106 |
nuclear@0 | 107 bool Timer::is_running() const |
nuclear@0 | 108 { |
nuclear@0 | 109 return pause_time == 0; |
nuclear@0 | 110 } |
nuclear@0 | 111 |
nuclear@0 | 112 unsigned long Timer::get_msec() const |
nuclear@0 | 113 { |
nuclear@0 | 114 if(!is_running()) { |
nuclear@0 | 115 // in paused state... |
nuclear@0 | 116 return pause_time - start_time; |
nuclear@0 | 117 } |
nuclear@0 | 118 return get_time_msec() - start_time; |
nuclear@0 | 119 } |
nuclear@0 | 120 |
nuclear@0 | 121 double Timer::get_sec() const |
nuclear@0 | 122 { |
nuclear@0 | 123 return (double)get_msec() / 1000.0; |
nuclear@0 | 124 } |