mirror of
https://github.com/python/cpython.git
synced 2025-09-15 21:26:04 +00:00
avoid a deadlock with the interpreter head lock and the GIL during finalization
This commit is contained in:
parent
17548dda51
commit
068f81e115
1 changed files with 8 additions and 0 deletions
|
@ -423,6 +423,14 @@ PyThreadState_DeleteCurrent()
|
||||||
Py_FatalError(
|
Py_FatalError(
|
||||||
"PyThreadState_DeleteCurrent: no current tstate");
|
"PyThreadState_DeleteCurrent: no current tstate");
|
||||||
_Py_atomic_store_relaxed(&_PyThreadState_Current, NULL);
|
_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)
|
if (autoInterpreterState && PyThread_get_key_value(autoTLSkey) == tstate)
|
||||||
PyThread_delete_key_value(autoTLSkey);
|
PyThread_delete_key_value(autoTLSkey);
|
||||||
tstate_delete_common(tstate);
|
tstate_delete_common(tstate);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue