From f35ddf24227e834c9b6b39ad23a0ec382b4de48b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 25 Sep 2021 00:31:56 +0200 Subject: [PATCH] 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. --- Python/pytime.c | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/Python/pytime.c b/Python/pytime.c index 7f9f301f720..b47a573488b 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; - } + // Since Windows XP, frequency cannot be zero. + assert(frequency >= 1); - /* Check that frequency can be casted to _PyTime_t. - - 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");