a resolution of 1 millisecond (10\ :sup:`-3` seconds).
(Contributed by Benjamin Szőke and Victor Stinner in :issue:`21302`.)
+* On Windows, :func:`time.sleep` now uses a waitable timer which supports high-resolution timers.
+ In Python 3.10, the best resolution was 1 ms, from Python 3.11 it's now smaller than 1 ms.
+ (Contributed by Dong-hee Na and Eryk Sun in :issue:`45429`.)
+
unicodedata
-----------
static int initialized;
static PyTypeObject StructTimeType;
+#if defined(MS_WINDOWS)
+#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
+ #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002
+#endif
+
+static DWORD timer_flags = (DWORD)-1;
+#endif
static PyObject *
tmtotuple(struct tm *p
utc_string = tm.tm_zone;
#endif
+#if defined(MS_WINDOWS)
+ if (timer_flags == (DWORD)-1) {
+ DWORD test_flags = CREATE_WAITABLE_TIMER_HIGH_RESOLUTION;
+ HANDLE timer = CreateWaitableTimerExW(NULL, NULL, test_flags,
+ TIMER_ALL_ACCESS);
+ if (timer == NULL) {
+ // CREATE_WAITABLE_TIMER_HIGH_RESOLUTION is not supported.
+ timer_flags = 0;
+ }
+ else {
+ // CREATE_WAITABLE_TIMER_HIGH_RESOLUTION is supported.
+ timer_flags = CREATE_WAITABLE_TIMER_HIGH_RESOLUTION;
+ CloseHandle(timer);
+ }
+ }
+#endif
+
return 0;
}
// SetWaitableTimer(): a negative due time indicates relative time
relative_timeout.QuadPart = -timeout_100ns;
- HANDLE timer = CreateWaitableTimerW(NULL, FALSE, NULL);
+ HANDLE timer = CreateWaitableTimerExW(NULL, NULL, timer_flags,
+ TIMER_ALL_ACCESS);
if (timer == NULL) {
PyErr_SetFromWindowsErr(0);
return -1;
}
- if (!SetWaitableTimer(timer, &relative_timeout,
- // period: the timer is signaled once
- 0,
- // no completion routine
- NULL, NULL,
- // Don't restore a system in suspended power
- // conservation mode when the timer is signaled.
- FALSE))
+ if (!SetWaitableTimerEx(timer, &relative_timeout,
+ 0, // no period; the timer is signaled once
+ NULL, NULL, // no completion routine
+ NULL, // no wake context; do not resume from suspend
+ 0)) // no tolerable delay for timer coalescing
{
PyErr_SetFromWindowsErr(0);
goto error;