summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2014-06-17 06:08:29 (GMT)
committerBenjamin Peterson <benjamin@python.org>2014-06-17 06:08:29 (GMT)
commit7258e6da3bc7e7c6bc47b6cf6f40f32849006db7 (patch)
treeb5231202b5ddd2fdb6b073d720111dcf87c9a4ec /Python
parente6bfdb9ca592382fc0a2f976dcf6d290f364220d (diff)
parent068f81e11528b367f56bc3922554fa2dd00a7071 (diff)
downloadcpython-7258e6da3bc7e7c6bc47b6cf6f40f32849006db7.zip
cpython-7258e6da3bc7e7c6bc47b6cf6f40f32849006db7.tar.gz
cpython-7258e6da3bc7e7c6bc47b6cf6f40f32849006db7.tar.bz2
merge 3.4
Diffstat (limited to 'Python')
-rw-r--r--Python/pystate.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/Python/pystate.c b/Python/pystate.c
index 2ac2fd5..8c1fad2 100644
--- a/Python/pystate.c
+++ b/Python/pystate.c
@@ -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);