mirror of
https://github.com/python/cpython.git
synced 2026-02-14 03:10:44 +00:00
bpo-33895: Relase GIL while calling functions that acquire Windows loader lock (GH-7789)
LoadLibrary, GetProcAddress, FreeLibrary and GetModuleHandle acquire the system loader lock. Calling these while holding the GIL will cause a deadlock on the rare occasion that another thread is detaching and needs to destroy its thread state at the same time.
This commit is contained in:
parent
2de576e16d
commit
4860f01ac0
8 changed files with 48 additions and 6 deletions
|
|
@ -984,10 +984,12 @@ winreg_DeleteKeyEx_impl(PyObject *module, HKEY key,
|
|||
|
||||
/* Only available on 64bit platforms, so we must load it
|
||||
dynamically. */
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
hMod = GetModuleHandleW(L"advapi32.dll");
|
||||
if (hMod)
|
||||
pfn = (RDKEFunc)GetProcAddress(hMod,
|
||||
"RegDeleteKeyExW");
|
||||
Py_END_ALLOW_THREADS
|
||||
if (!pfn) {
|
||||
PyErr_SetString(PyExc_NotImplementedError,
|
||||
"not implemented on this platform");
|
||||
|
|
@ -1714,10 +1716,12 @@ winreg_DisableReflectionKey_impl(PyObject *module, HKEY key)
|
|||
|
||||
/* Only available on 64bit platforms, so we must load it
|
||||
dynamically.*/
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
hMod = GetModuleHandleW(L"advapi32.dll");
|
||||
if (hMod)
|
||||
pfn = (RDRKFunc)GetProcAddress(hMod,
|
||||
"RegDisableReflectionKey");
|
||||
Py_END_ALLOW_THREADS
|
||||
if (!pfn) {
|
||||
PyErr_SetString(PyExc_NotImplementedError,
|
||||
"not implemented on this platform");
|
||||
|
|
@ -1757,10 +1761,12 @@ winreg_EnableReflectionKey_impl(PyObject *module, HKEY key)
|
|||
|
||||
/* Only available on 64bit platforms, so we must load it
|
||||
dynamically.*/
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
hMod = GetModuleHandleW(L"advapi32.dll");
|
||||
if (hMod)
|
||||
pfn = (RERKFunc)GetProcAddress(hMod,
|
||||
"RegEnableReflectionKey");
|
||||
Py_END_ALLOW_THREADS
|
||||
if (!pfn) {
|
||||
PyErr_SetString(PyExc_NotImplementedError,
|
||||
"not implemented on this platform");
|
||||
|
|
@ -1799,10 +1805,12 @@ winreg_QueryReflectionKey_impl(PyObject *module, HKEY key)
|
|||
|
||||
/* Only available on 64bit platforms, so we must load it
|
||||
dynamically.*/
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
hMod = GetModuleHandleW(L"advapi32.dll");
|
||||
if (hMod)
|
||||
pfn = (RQRKFunc)GetProcAddress(hMod,
|
||||
"RegQueryReflectionKey");
|
||||
Py_END_ALLOW_THREADS
|
||||
if (!pfn) {
|
||||
PyErr_SetString(PyExc_NotImplementedError,
|
||||
"not implemented on this platform");
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue