]> granicus.if.org Git - python/commitdiff
avoid a deadlock with the interpreter head lock and the GIL during finalization
authorBenjamin Peterson <benjamin@python.org>
Tue, 17 Jun 2014 06:07:49 +0000 (23:07 -0700)
committerBenjamin Peterson <benjamin@python.org>
Tue, 17 Jun 2014 06:07:49 +0000 (23:07 -0700)
Python/pystate.c

index 2ac2fd5274d4059a4a765dac87f0e5cf9ad685bd..8c1fad215c2afdec5e1ed9c2ae896314e9ba24ab 100644 (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);