[libcxx] r290804 - chrono: give Windows a steady_clock

Saleem Abdulrasool via cfe-commits cfe-commits at lists.llvm.org
Sun Jan 1 12:20:44 PST 2017


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




More information about the cfe-commits mailing list