diff --git a/qrenderdoc/Code/ReplayManager.cpp b/qrenderdoc/Code/ReplayManager.cpp index 83cc1bcca..0a6e30448 100644 --- a/qrenderdoc/Code/ReplayManager.cpp +++ b/qrenderdoc/Code/ReplayManager.cpp @@ -294,8 +294,12 @@ void ReplayManager::BlockInvoke(ReplayManager::ReplayInvokeCallback m) PushInvoke(cmd); + void *ctx = PythonContext::PausePythonThreading(); + cmd->processed.acquire(); + PythonContext::ResumePythonThreading(ctx); + delete cmd; } @@ -315,6 +319,8 @@ void ReplayManager::CloseThread() if(m_Thread == NULL) return; + void *ctx = PythonContext::PausePythonThreading(); + // wait for the thread to close and clean up while(m_Thread->isRunning()) { @@ -322,6 +328,8 @@ void ReplayManager::CloseThread() m_Thread->deleteLater(); m_Thread = NULL; + + PythonContext::ResumePythonThreading(ctx); } ResultDetails ReplayManager::ConnectToRemoteServer(RemoteHost host) diff --git a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp index 75fc7fff8..fece2c673 100644 --- a/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp +++ b/qrenderdoc/Code/pyrenderdoc/PythonContext.cpp @@ -1146,12 +1146,13 @@ void PythonContext::Finish() void *PythonContext::PausePythonThreading() { - return PyEval_SaveThread(); + return PyGILState_Check() == 0 ? NULL : PyEval_SaveThread(); } void PythonContext::ResumePythonThreading(void *ctx) { - PyEval_RestoreThread((PyThreadState *)ctx); + if(ctx) + PyEval_RestoreThread((PyThreadState *)ctx); } void PythonContext::GlobalShutdown()