From 81669697aa85acb22c3e02c1c7d2788a30ecfee7 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Mon, 16 Jun 2014 23:07:49 -0700 Subject: [PATCH] avoid a deadlock with the interpreter head lock and the GIL during finalization --- Python/pystate.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Python/pystate.c b/Python/pystate.c index 56eed88407..7584ea0d83 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -315,7 +315,14 @@ PyThreadState_DeleteCurrent() Py_FatalError( "PyThreadState_DeleteCurrent: no current tstate"); _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) PyThread_delete_key_value(autoTLSkey); PyEval_ReleaseLock(); -- 2.50.1