mirror of https://github.com/python/cpython
Release the GIL during COM method calls, to avoid deadlocks in
Python coded COM objects.
This commit is contained in:
parent
0e0c9f4740
commit
0d5d222959
|
@ -804,14 +804,20 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk)
|
|||
PyObject *obj;
|
||||
TCHAR *text;
|
||||
|
||||
/* We absolutely have to release the GIL during COM method calls,
|
||||
otherwise we may get a deadlock!
|
||||
*/
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
|
||||
hr = pIunk->lpVtbl->QueryInterface(pIunk, &IID_ISupportErrorInfo, (void **)&psei);
|
||||
if (FAILED(hr))
|
||||
goto failed;
|
||||
|
||||
hr = psei->lpVtbl->InterfaceSupportsErrorInfo(psei, riid);
|
||||
psei->lpVtbl->Release(psei);
|
||||
|
||||
if (FAILED(hr))
|
||||
goto failed;
|
||||
|
||||
hr = GetErrorInfo(0, &pei);
|
||||
if (hr != S_OK)
|
||||
goto failed;
|
||||
|
@ -822,10 +828,11 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk)
|
|||
pei->lpVtbl->GetHelpFile(pei, &helpfile);
|
||||
pei->lpVtbl->GetSource(pei, &source);
|
||||
|
||||
failed:
|
||||
if (pei)
|
||||
pei->lpVtbl->Release(pei);
|
||||
|
||||
failed:
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
progid = NULL;
|
||||
ProgIDFromCLSID(&guid, &progid);
|
||||
|
||||
|
|
Loading…
Reference in New Issue