changeset: 92266:76bc15c918b1 user: Victor Stinner date: Fri Aug 29 16:51:33 2014 +0200 files: Modules/timemodule.c description: 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. diff -r 668e0bf30042 -r 76bc15c918b1 Modules/timemodule.c --- a/Modules/timemodule.c Fri Aug 29 16:31:59 2014 +0200 +++ b/Modules/timemodule.c Fri Aug 29 16:51:33 2014 +0200 @@ -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 *