summaryrefslogtreecommitdiffstats
path: root/src/common/steady_clock.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/steady_clock.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/common/steady_clock.cpp b/src/common/steady_clock.cpp
index 0d5908aa7..782859196 100644
--- a/src/common/steady_clock.cpp
+++ b/src/common/steady_clock.cpp
@@ -23,6 +23,19 @@ static s64 WindowsQueryPerformanceCounter() {
QueryPerformanceCounter(&counter);
return counter.QuadPart;
}
+
+static s64 GetSystemTimeNS() {
+ // GetSystemTimePreciseAsFileTime returns the file time in 100ns units.
+ static constexpr s64 Multiplier = 100;
+ // Convert Windows epoch to Unix epoch.
+ static constexpr s64 WindowsEpochToUnixEpochNS = 0x19DB1DED53E8000LL;
+
+ FILETIME filetime;
+ GetSystemTimePreciseAsFileTime(&filetime);
+ return Multiplier * ((static_cast<s64>(filetime.dwHighDateTime) << 32) +
+ static_cast<s64>(filetime.dwLowDateTime)) -
+ WindowsEpochToUnixEpochNS;
+}
#endif
SteadyClock::time_point SteadyClock::Now() noexcept {
@@ -53,4 +66,16 @@ SteadyClock::time_point SteadyClock::Now() noexcept {
#endif
}
+RealTimeClock::time_point RealTimeClock::Now() noexcept {
+#if defined(_WIN32)
+ return time_point{duration{GetSystemTimeNS()}};
+#elif defined(__APPLE__)
+ return time_point{duration{clock_gettime_nsec_np(CLOCK_REALTIME)}};
+#else
+ timespec ts;
+ clock_gettime(CLOCK_REALTIME, &ts);
+ return time_point{std::chrono::seconds{ts.tv_sec} + std::chrono::nanoseconds{ts.tv_nsec}};
+#endif
+}
+
}; // namespace Common