diff --git a/Misc/NEWS.d/next/Windows/2020-03-04-17-05-11.bpo-39847.C3N2m3.rst b/Misc/NEWS.d/next/Windows/2020-03-04-17-05-11.bpo-39847.C3N2m3.rst new file mode 100644 index 00000000000..acfbce53eb3 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2020-03-04-17-05-11.bpo-39847.C3N2m3.rst @@ -0,0 +1,2 @@ +Avoid hang when computer is hibernated whilst waiting for a mutex (for +lock-related objects from :mod:`threading`) around 49-day uptime. diff --git a/Python/thread_nt.h b/Python/thread_nt.h index a5246dd0504..23d585cf9fa 100644 --- a/Python/thread_nt.h +++ b/Python/thread_nt.h @@ -75,16 +75,16 @@ EnterNonRecursiveMutex(PNRMUTEX mutex, DWORD milliseconds) } } else if (milliseconds != 0) { /* wait at least until the target */ - DWORD now, target = GetTickCount() + milliseconds; + ULONGLONG now, target = GetTickCount64() + milliseconds; while (mutex->locked) { if (PyCOND_TIMEDWAIT(&mutex->cv, &mutex->cs, (long long)milliseconds*1000) < 0) { result = WAIT_FAILED; break; } - now = GetTickCount(); + now = GetTickCount64(); if (target <= now) break; - milliseconds = target-now; + milliseconds = (DWORD)(target-now); } } if (!mutex->locked) {