[Python-checkins] cpython: Issue #22043: Simplify time.perf_counter() on Windows

victor.stinner python-checkins at python.org
Fri Aug 29 16:58:35 CEST 2014


http://hg.python.org/cpython/rev/76bc15c918b1
changeset:   92266:76bc15c918b1
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Fri Aug 29 16:51:33 2014 +0200
summary:
  Issue #22043: Simplify time.perf_counter() on Windows

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.

files:
  Modules/timemodule.c |  46 +++++++++++--------------------
  1 files changed, 16 insertions(+), 30 deletions(-)


diff --git a/Modules/timemodule.c b/Modules/timemodule.c
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -96,8 +96,8 @@
 #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 @@
         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 @@
         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 @@
 pyclock(_Py_clock_info_t *info)
 {
 #ifdef WIN32_PERF_COUNTER
-    PyObject *res;
-    if (win_perf_counter(info, &res) == 0)
-        return res;
+    return win_perf_counter(info);
+#else
+    return floatclock(info);
 #endif
-    return floatclock(info);
 }
 
 static PyObject *
@@ -1036,35 +1032,25 @@
 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 WIN32_PERF_COUNTER
+    return win_perf_counter(info);
+#else
+
 #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
-
-#ifdef PYMONOTONIC
     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 *

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list