[Python-checkins] cpython (3.4): avoid a deadlock with the interpreter head lock and the GIL during finalization

benjamin.peterson python-checkins at python.org
Tue Jun 17 08:08:54 CEST 2014


http://hg.python.org/cpython/rev/5ccb6901cf95
changeset:   91234:5ccb6901cf95
branch:      3.4
parent:      91231:d1d1ed421717
user:        Benjamin Peterson <benjamin at python.org>
date:        Mon Jun 16 23:07:49 2014 -0700
summary:
  avoid a deadlock with the interpreter head lock and the GIL during finalization

files:
  Python/pystate.c |  8 ++++++++
  1 files changed, 8 insertions(+), 0 deletions(-)


diff --git a/Python/pystate.c b/Python/pystate.c
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -423,6 +423,14 @@
         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);

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list