summaryrefslogtreecommitdiff
path: root/Python
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2014-06-16 23:07:49 -0700
committerBenjamin Peterson <benjamin@python.org>2014-06-16 23:07:49 -0700
commitac11692d947a5d4d6566127cfda8ed9188e3c438 (patch)
tree3f458f7215df47625346a4027a5d5bce88b4527b /Python
parent19f48b63383721cee8c02d043d3aa6f364b24b4f (diff)
downloadcpython-ac11692d947a5d4d6566127cfda8ed9188e3c438.tar.gz
avoid a deadlock with the interpreter head lock and the GIL during finalization
Diffstat (limited to 'Python')
-rw-r--r--Python/pystate.c9
1 files changed, 8 insertions, 1 deletions
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();