diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index ac27ee8251..a6d806d066 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -551,6 +551,7 @@ rtc_library("timeutils") { ":stringutils", "system:rtc_export", ] + if (rtc_exclude_system_time) { defines = [ "WEBRTC_EXCLUDE_SYSTEM_TIME" ] } @@ -558,6 +559,7 @@ rtc_library("timeutils") { libs = [] if (is_win) { libs += [ "winmm.lib" ] + deps += [ ":win32" ] } } @@ -1070,7 +1072,6 @@ if (is_win) { deps = [ ":byte_order", ":checks", - ":logging", ":macromagic", ":stringutils", ] diff --git a/rtc_base/time_utils.cc b/rtc_base/time_utils.cc index 78434536e1..9f112e49c1 100644 --- a/rtc_base/time_utils.cc +++ b/rtc_base/time_utils.cc @@ -14,17 +14,27 @@ #include #endif -#if defined(WEBRTC_WIN) -#include -#endif - #include "rtc_base/checks.h" #include "rtc_base/numerics/safe_conversions.h" #include "rtc_base/system_time.h" #include "rtc_base/time_utils.h" +#if defined(WEBRTC_WIN) +#include "rtc_base/win32.h" +#endif +#if defined(WEBRTC_WIN) +#include +#endif namespace rtc { +#if defined(WEBRTC_WIN) || defined(WINUWP) +// FileTime (January 1st 1601) to Unix time (January 1st 1970) +// offset in units of 100ns. +static constexpr uint64_t kFileTimeToUnixTimeEpochOffset = + 116444736000000000ULL; +static constexpr uint64_t kFileTimeToMicroSeconds = 10LL; +#endif + ClockInterface* g_clock = nullptr; ClockInterface* SetClockForTesting(ClockInterface* clock) { @@ -115,8 +125,6 @@ class TimeHelper final { } private: - static constexpr uint64_t kFileTimeToUnixTimeEpochOffset = - 116444736000000000ULL; static constexpr uint64_t kNTPTimeToUnixTimeEpochOffset = 2208988800000L; // The number of nanoseconds since unix system epoch @@ -231,13 +239,15 @@ int64_t TimeUTCMicros() { // Convert from second (1.0) and microsecond (1e-6). return (static_cast(time.tv_sec) * rtc::kNumMicrosecsPerSec + time.tv_usec); - #elif defined(WEBRTC_WIN) - struct _timeb time; - _ftime(&time); - // Convert from second (1.0) and milliseconds (1e-3). - return (static_cast(time.time) * rtc::kNumMicrosecsPerSec + - static_cast(time.millitm) * rtc::kNumMicrosecsPerMillisec); + FILETIME ft; + // This will give us system file in UTC format in multiples of 100ns. + GetSystemTimeAsFileTime(&ft); + LARGE_INTEGER li; + li.HighPart = ft.dwHighDateTime; + li.LowPart = ft.dwLowDateTime; + return (li.QuadPart - kFileTimeToUnixTimeEpochOffset) / + kFileTimeToMicroSeconds; #endif } diff --git a/rtc_base/win32.cc b/rtc_base/win32.cc index b44e513026..9ce0523413 100644 --- a/rtc_base/win32.cc +++ b/rtc_base/win32.cc @@ -18,7 +18,6 @@ #include "rtc_base/arraysize.h" #include "rtc_base/byte_order.h" #include "rtc_base/checks.h" -#include "rtc_base/logging.h" #include "rtc_base/string_utils.h" namespace rtc {