Commit 81669697 authored by Benjamin Peterson's avatar Benjamin Peterson

avoid a deadlock with the interpreter head lock and the GIL during finalization

parent 1c78e6d9
...@@ -315,7 +315,14 @@ PyThreadState_DeleteCurrent() ...@@ -315,7 +315,14 @@ PyThreadState_DeleteCurrent()
Py_FatalError( Py_FatalError(
"PyThreadState_DeleteCurrent: no current tstate"); "PyThreadState_DeleteCurrent: no current tstate");
_PyThreadState_Current = NULL; _PyThreadState_Current = NULL;
tstate_delete_common(tstate); /*
Only call tstate_delete_common to have the tstate if we're not finalizing
or we're the main thread. The main thread will do this for us. Not calling
tstate_delete_common means we won't lock the interpreter head lock,
avoiding a possible deadlock with the GIL.
*/
if (!_Py_Finalizing || _Py_Finalizing == tstate)
tstate_delete_common(tstate);
if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate) if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
PyThread_delete_key_value(autoTLSkey); PyThread_delete_key_value(autoTLSkey);
PyEval_ReleaseLock(); PyEval_ReleaseLock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment