[Python-checkins] cpython (2.7): 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:53 CEST 2014


http://hg.python.org/cpython/rev/58c638e86e30
changeset: 91233:58c638e86e30
branch: 2.7
parent: 91230:0432b0d99175
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 | 9 ++++++++-
 1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/Python/pystate.c b/Python/pystate.c
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -315,7 +315,14 @@
 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();
-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /