aboutsummaryrefslogtreecommitdiff
path: root/Spear/Sys/Timer/timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'Spear/Sys/Timer/timer.c')
-rw-r--r--Spear/Sys/Timer/timer.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/Spear/Sys/Timer/timer.c b/Spear/Sys/Timer/timer.c
index 8487f48..55e64b5 100644
--- a/Spear/Sys/Timer/timer.c
+++ b/Spear/Sys/Timer/timer.c
@@ -48,7 +48,7 @@ void time_now(time_point* t) {
48#ifdef _WIN32 48#ifdef _WIN32
49 QueryPerformanceCounter((LARGE_INTEGER*)t); 49 QueryPerformanceCounter((LARGE_INTEGER*)t);
50#else 50#else
51 clock_gettime(CLOCK_REALTIME, t); 51 clock_gettime(CLOCK_MONOTONIC_RAW, t);
52#endif 52#endif
53} 53}
54 54
@@ -59,7 +59,7 @@ time_delta time_diff(time_point* start, time_point* end) {
59 // another processor, then the delta time can be negative. 59 // another processor, then the delta time can be negative.
60 return std::max(0, *end - *start); 60 return std::max(0, *end - *start);
61#else 61#else
62 return (end->tv_sec - start->tv_sec) * 1e9 + (end->tv_nsec - start->tv_nsec); 62 return (end->tv_sec - start->tv_sec) * nanoseconds + (end->tv_nsec - start->tv_nsec);
63#endif 63#endif
64} 64}
65 65
@@ -83,16 +83,25 @@ uint64_t time_point_to_ns(time_point* t) {
83#ifdef _WIN32 83#ifdef _WIN32
84 return (uint64_t)((double)*t * seconds_per_count * 1.0e+9); 84 return (uint64_t)((double)*t * seconds_per_count * 1.0e+9);
85#else 85#else
86 return (uint64_t)t->tv_sec * 1e+9 + (uint64_t)t->tv_nsec; 86 return (uint64_t)t->tv_sec * nanoseconds + (uint64_t)t->tv_nsec;
87#endif
88}
89
90void time_add(const time_point* t, time_delta dt, time_point* out) {
91#ifdef _WIN32
92 *out = *t + dt;
93#else
94 out->tv_sec = t->tv_sec + (__time_t)(dt / nanoseconds);
95 out->tv_nsec = t->tv_nsec + (__time_t)(dt % nanoseconds);
87#endif 96#endif
88} 97}
89 98
90void time_sleep(time_delta dt) { 99void time_sleep(time_delta dt) {
91#ifdef _WIN32 100#ifdef _WIN32
92 const int64_t ms = dt / microseconds; 101 const uint64_t ms = dt / microseconds;
93 Sleep((DWORD)(ms)); 102 Sleep((DWORD)(ms));
94#else 103#else
95 const int64_t sec = dt / nanoseconds; 104 const uint64_t sec = dt / nanoseconds;
96 struct timespec ts; 105 struct timespec ts;
97 ts.tv_sec = (long)sec; 106 ts.tv_sec = (long)sec;
98 ts.tv_nsec = (long)(dt % nanoseconds); 107 ts.tv_nsec = (long)(dt % nanoseconds);