mirror of
https://github.com/KjellKod/g3log.git
synced 2025-03-01 10:57:57 +01:00
fix timing inaccuracy on windows
This commit is contained in:
parent
813e3da1f9
commit
069085c451
33
src/time.cpp
33
src/time.cpp
@ -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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user