fix timing inaccuracy on windows

This commit is contained in:
SchoenleAndi 2016-12-04 16:09:23 +01:00
parent 813e3da1f9
commit 069085c451

View File

@ -87,20 +87,27 @@ namespace g3 {
int timespec_get(struct timespec* ts/*, int base*/) { int timespec_get(struct timespec* ts/*, int base*/) {
#ifdef __MACH__ #ifdef __MACH__
// std::timespec_get or posix clock_gettime)(...) are not // std::timespec_get or posix clock_gettime)(...) are not
// implemented on OSX // implemented on OSX
// @return value of base if successful, else zero // @return value of base if successful, else zero
struct timeval now = {}; struct timeval now = {};
int rv = gettimeofday(&now, nullptr); int rv = gettimeofday(&now, nullptr);
if (-1 == rv) { if (-1 == rv) {
return rv; return rv;
} }
// error mode. just return sec, microsecond // error mode. just return sec, microsecond
ts->tv_sec = now.tv_sec; ts->tv_sec = now.tv_sec;
ts->tv_nsec = now.tv_usec * 1000; ts->tv_nsec = now.tv_usec * 1000;
return 0; return 0;
#elif(defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) #elif(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
return timespec_get(ts, TIME_UTC); static auto os =
std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::system_clock::now()).time_since_epoch() -
std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now()).time_since_epoch();
auto now_ns = (std::chrono::time_point_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now()).time_since_epoch() + os).count();
ts ->tv_sec = now_ns / 1000000000;
ts ->tv_nsec = now_ns % 1000000000;
return TIME_UTC;
#else #else
// ubuntu/gcc5 has no support for std::timespec_get(...) as of yet // ubuntu/gcc5 has no support for std::timespec_get(...) as of yet
return clock_gettime(CLOCK_REALTIME, ts); return clock_gettime(CLOCK_REALTIME, ts);