From: Thomas Heller Date: Sun, 11 Jun 2006 17:04:22 +0000 (+0000) Subject: Release the GIL during COM method calls, to avoid deadlocks in X-Git-Tag: v2.5b1~131 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0d5d222959e0422b93065f0661b06061b713e5af;p=thirdparty%2FPython%2Fcpython.git Release the GIL during COM method calls, to avoid deadlocks in Python coded COM objects. --- diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index 92a6c3c63b2a..c4942a0abddf 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -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,9 +828,10 @@ GetComError(HRESULT errcode, GUID *riid, IUnknown *pIunk) pei->lpVtbl->GetHelpFile(pei, &helpfile); pei->lpVtbl->GetSource(pei, &source); + pei->lpVtbl->Release(pei); + failed: - if (pei) - pei->lpVtbl->Release(pei); + Py_END_ALLOW_THREADS progid = NULL; ProgIDFromCLSID(&guid, &progid);