Author: compnerd Date: Sun Jan 1 14:20:43 2017 New Revision: 290804 URL: http://llvm.org/viewvc/llvm-project?rev=290804&view=rev Log: chrono: give Windows a steady_clock
Provide a definition for a steady monotonic clock by wrapping QueryPerformanceCounter. Modified: libcxx/trunk/src/chrono.cpp Modified: libcxx/trunk/src/chrono.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/chrono.cpp?rev=290804&r1=290803&r2=290804&view=diff ============================================================================== --- libcxx/trunk/src/chrono.cpp (original) +++ libcxx/trunk/src/chrono.cpp Sun Jan 1 14:20:43 2017 @@ -25,10 +25,10 @@ #endif #endif -#if !defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(CLOCK_MONOTONIC) +#if !defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) #if __APPLE__ #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" #endif #endif @@ -101,18 +101,7 @@ system_clock::from_time_t(time_t t) _NOE const bool steady_clock::is_steady; -#ifdef 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)); -} - -#elif defined(__APPLE__) +#if defined(__APPLE__) // mach_absolute_time() * MachInfo.numer / MachInfo.denom is the number of // nanoseconds since the computer booted up. MachInfo.numer and MachInfo.denom @@ -166,6 +155,32 @@ steady_clock::now() _NOEXCEPT 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 #error "Monotonic clock not implemented" #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits