]> granicus.if.org Git - python/commitdiff
Issue #22043: Simplify time.perf_counter() on Windows
authorVictor Stinner <victor.stinner@gmail.com>
Fri, 29 Aug 2014 14:51:33 +0000 (16:51 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Fri, 29 Aug 2014 14:51:33 +0000 (16:51 +0200)
QueryPerformanceFrequency() cannot fail on Windows XP and later according to
its documentation: raise an exception on error and drop the fallback to the
system clock.

Modules/timemodule.c

index 1a13fd0ed71980efd3834cf01078717673bdb2a2..abf4b8b622b9303666c47605b2408d178ce49c9c 100644 (file)
@@ -96,8 +96,8 @@ floatclock(_Py_clock_info_t *info)
 #define WIN32_PERF_COUNTER
 /* Win32 has better clock replacement; we have our own version, due to Mark
    Hammond and Tim Peters */
-static int
-win_perf_counter(_Py_clock_info_t *info, PyObject **result)
+static PyObject*
+win_perf_counter(_Py_clock_info_t *info)
 {
     static LONGLONG cpu_frequency = 0;
     static LONGLONG ctrStart;
@@ -109,10 +109,8 @@ win_perf_counter(_Py_clock_info_t *info, PyObject **result)
         QueryPerformanceCounter(&now);
         ctrStart = now.QuadPart;
         if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {
-            /* Unlikely to happen - this works on all intel
-               machines at least!  Revert to clock() */
-            *result = NULL;
-            return -1;
+            PyErr_SetFromWindowsErr(0);
+            return NULL;
         }
         cpu_frequency = freq.QuadPart;
     }
@@ -124,8 +122,7 @@ win_perf_counter(_Py_clock_info_t *info, PyObject **result)
         info->monotonic = 1;
         info->adjustable = 0;
     }
-    *result = PyFloat_FromDouble(diff / (double)cpu_frequency);
-    return 0;
+    return PyFloat_FromDouble(diff / (double)cpu_frequency);
 }
 #endif
 
@@ -135,11 +132,10 @@ static PyObject*
 pyclock(_Py_clock_info_t *info)
 {
 #ifdef WIN32_PERF_COUNTER
-    PyObject *res;
-    if (win_perf_counter(info, &res) == 0)
-        return res;
-#endif
+    return win_perf_counter(info);
+#else
     return floatclock(info);
+#endif
 }
 
 static PyObject *
@@ -1036,35 +1032,25 @@ Monotonic clock, cannot go backward.");
 static PyObject*
 perf_counter(_Py_clock_info_t *info)
 {
-#if defined(WIN32_PERF_COUNTER) || defined(PYMONOTONIC)
-    PyObject *res;
-#endif
-#if defined(WIN32_PERF_COUNTER)
-    static int use_perf_counter = 1;
-#endif
-#ifdef PYMONOTONIC
-    static int use_monotonic = 1;
-#endif
-
 #ifdef WIN32_PERF_COUNTER
-    if (use_perf_counter) {
-        if (win_perf_counter(info, &res) == 0)
-            return res;
-        use_perf_counter = 0;
-    }
-#endif
+    return win_perf_counter(info);
+#else
 
 #ifdef PYMONOTONIC
+    static int use_monotonic = 1;
+
     if (use_monotonic) {
-        res = pymonotonic(info);
+        PyObject *res = pymonotonic(info);
         if (res != NULL)
             return res;
         use_monotonic = 0;
         PyErr_Clear();
     }
+#else
+    return floattime(info);
 #endif
 
-    return floattime(info);
+#endif
 }
 
 static PyObject *