[Python-checkins] bpo-41299: QueryPerformanceFrequency() cannot fail (GH-28552)

vstinner webhook-mailer at python.org
Fri Sep 24 18:32:04 EDT 2021


https://github.com/python/cpython/commit/f35ddf24227e834c9b6b39ad23a0ec382b4de48b
commit: f35ddf24227e834c9b6b39ad23a0ec382b4de48b
branch: main
author: Victor Stinner <vstinner at python.org>
committer: vstinner <vstinner at python.org>
date: 2021-09-25T00:31:56+02:00
summary:

bpo-41299: QueryPerformanceFrequency() cannot fail (GH-28552)

py_win_perf_counter_frequency() no longer checks for
QueryPerformanceFrequency() failure. According to the
QueryPerformanceFrequency() documentation, the function can no longer
fails since Windows XP.

files:
M Python/pytime.c

diff --git a/Python/pytime.c b/Python/pytime.c
index 7f9f301f72090..b47a573488b6d 100644
--- a/Python/pytime.c
+++ b/Python/pytime.c
@@ -1050,26 +1050,14 @@ py_win_perf_counter_frequency(LONGLONG *pfrequency, int raise)
     LONGLONG frequency;
 
     LARGE_INTEGER freq;
-    if (!QueryPerformanceFrequency(&freq)) {
-        if (raise) {
-            PyErr_SetFromWindowsErr(0);
-        }
-        return -1;
-    }
+    // Since Windows XP, the function cannot fail.
+    (void)QueryPerformanceFrequency(&freq);
     frequency = freq.QuadPart;
 
-    /* Sanity check: should never occur in practice */
-    if (frequency < 1) {
-        if (raise) {
-            PyErr_SetString(PyExc_RuntimeError,
-                            "invalid QueryPerformanceFrequency");
-        }
-        return -1;
-    }
-
-    /* Check that frequency can be casted to _PyTime_t.
+    // Since Windows XP, frequency cannot be zero.
+    assert(frequency >= 1);
 
-       Make also sure that (ticks * SEC_TO_NS) cannot overflow in
+    /* Make also sure that (ticks * SEC_TO_NS) cannot overflow in
        _PyTime_MulDiv(), with ticks < frequency.
 
        Known QueryPerformanceFrequency() values:
@@ -1078,10 +1066,8 @@ py_win_perf_counter_frequency(LONGLONG *pfrequency, int raise)
        * 3,579,545 Hz (3.6 MHz): 279 ns resolution
 
        None of these frequencies can overflow with 64-bit _PyTime_t, but
-       check for overflow, just in case. */
-    if (frequency > _PyTime_MAX
-        || frequency > (LONGLONG)_PyTime_MAX / (LONGLONG)SEC_TO_NS)
-    {
+       check for integer overflow just in case. */
+    if (frequency > _PyTime_MAX / SEC_TO_NS) {
         if (raise) {
             PyErr_SetString(PyExc_OverflowError,
                             "QueryPerformanceFrequency is too large");



More information about the Python-checkins mailing list