chrono: give Windows a steady_clock

Provide a definition for a steady monotonic clock by wrapping
QueryPerformanceCounter.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@290804 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Saleem Abdulrasool
2017-01-01 20:20:43 +00:00
parent 67372ee77e
commit 75748cde64

View File

@@ -25,10 +25,10 @@
#endif #endif
#endif #endif
#if !defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(CLOCK_MONOTONIC) #if !defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK)
#if __APPLE__ #if __APPLE__
#include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t #include <mach/mach_time.h> // mach_absolute_time, mach_timebase_info_data_t
#else #elif !defined(_WIN32) && !defined(CLOCK_MONOTONIC)
#error "Monotonic clock not implemented" #error "Monotonic clock not implemented"
#endif #endif
#endif #endif
@@ -101,18 +101,7 @@ system_clock::from_time_t(time_t t) _NOEXCEPT
const bool steady_clock::is_steady; const bool steady_clock::is_steady;
#ifdef CLOCK_MONOTONIC #if defined(__APPLE__)
steady_clock::time_point
steady_clock::now() _NOEXCEPT
{
struct timespec tp;
if (0 != clock_gettime(CLOCK_MONOTONIC, &tp))
__throw_system_error(errno, "clock_gettime(CLOCK_MONOTONIC) failed");
return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec));
}
#elif defined(__APPLE__)
// mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of // mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of
// nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom // nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom
@@ -166,6 +155,32 @@ steady_clock::now() _NOEXCEPT
return time_point(duration(fp())); return time_point(duration(fp()));
} }
#elif defined(_WIN32)
steady_clock::time_point
steady_clock::now() _NOEXCEPT
{
static LARGE_INTEGER liFreq;
static BOOL bQPFRun = FALSE;
if (bQPFRun == FALSE)
bQPFRun = QueryPerformanceFrequency(&liFreq);
LARGE_INTEGER liCntr;
QueryPerformanceCounter(&liCntr);
return time_point(duration(liCntr.QuadPart * nano::den / liFreq.QuadPart));
}
#elif defined(CLOCK_MONOTONIC)
steady_clock::time_point
steady_clock::now() _NOEXCEPT
{
struct timespec tp;
if (0 != clock_gettime(CLOCK_MONOTONIC, &tp))
__throw_system_error(errno, "clock_gettime(CLOCK_MONOTONIC) failed");
return time_point(seconds(tp.tv_sec) + nanoseconds(tp.tv_nsec));
}
#else #else
#error "Monotonic clock not implemented" #error "Monotonic clock not implemented"
#endif #endif