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

This commit is contained in:
Benjamin Peterson 2014-06-16 23:07:49 -07:00
parent 17548dda51
commit 068f81e115
1 changed files with 8 additions and 0 deletions

View File

@ -423,6 +423,14 @@ PyThreadState_DeleteCurrent()
Py_FatalError(
"PyThreadState_DeleteCurrent: no current tstate");
_Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
/*
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)
PyThread_delete_key_value(autoTLSkey);
tstate_delete_common(tstate);