From: Sizhe Zhao Date: Thu, 26 Aug 2021 20:11:54 +0000 (+0300) Subject: [libcxx] Use GetSystemTimePreciseAsFileTime() if available X-Git-Tag: upstream/15.0.7~32840 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3ec634e65a02d5f443cc982e9e00ec4e51143d07;p=platform%2Fupstream%2Fllvm.git [libcxx] Use GetSystemTimePreciseAsFileTime() if available We will try to use GetSystemTimePreciseAsFileTime if possible. Reference: https://sourceforge.net/p/mingw-w64/mingw-w64/ci/59195b2d7fe26549f70969b0dd487293819f023e/. Reviewed By: compnerd, #libc, mstorsjo, ldionne Differential Revision: https://reviews.llvm.org/D104987 --- diff --git a/libcxx/src/chrono.cpp b/libcxx/src/chrono.cpp index 13b3759..6f5d2ba 100644 --- a/libcxx/src/chrono.cpp +++ b/libcxx/src/chrono.cpp @@ -63,6 +63,28 @@ namespace chrono #if defined(_LIBCPP_WIN32API) +#if _WIN32_WINNT < _WIN32_WINNT_WIN8 + +namespace { + +typedef void(WINAPI *GetSystemTimeAsFileTimePtr)(LPFILETIME); + +class GetSystemTimeInit { +public: + GetSystemTimeInit() { + fp = (GetSystemTimeAsFileTimePtr)GetProcAddress( + GetModuleHandleW(L"kernel32.dll"), "GetSystemTimePreciseAsFileTime"); + if (fp == nullptr) + fp = GetSystemTimeAsFileTime; + } + GetSystemTimeAsFileTimePtr fp; +}; + +GetSystemTimeInit GetSystemTimeAsFileTimeFunc _LIBCPP_INIT_PRIORITY_MAX; +} // namespace + +#endif + static system_clock::time_point __libcpp_system_clock_now() { // FILETIME is in 100ns units using filetime_duration = @@ -74,10 +96,13 @@ static system_clock::time_point __libcpp_system_clock_now() { static _LIBCPP_CONSTEXPR const seconds nt_to_unix_epoch{11644473600}; FILETIME ft; -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8 && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)) || \ + (_WIN32_WINNT >= _WIN32_WINNT_WIN10) GetSystemTimePreciseAsFileTime(&ft); -#else +#elif !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) GetSystemTimeAsFileTime(&ft); +#else + GetSystemTimeAsFileTimeFunc.fp(&ft); #endif filetime_duration d{(static_cast<__int64>(ft.dwHighDateTime) << 32) |