diff options
author | Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com> | 2023-03-03 18:44:30 +0530 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2023-06-06 18:11:46 +0200 |
commit | f61e843cd15ae7e6b61576e3bfc4f29a69dfa99c (patch) | |
tree | 8523263d100a4808d6be2754017d4d95e27f2bb3 | |
parent | gh-99418: Make urllib.parse.urlparse enforce that a scheme must begin with an... (diff) | |
download | cpython-gentoo-3.8.17.tar.gz cpython-gentoo-3.8.17.tar.bz2 cpython-gentoo-3.8.17.zip |
[3.10] GH-102126: fix deadlock at shutdown when clearing thread state… (#102235)gentoo-3.8.17
[3.10] GH-102126: fix deadlock at shutdown when clearing thread states (GH-102222).
(cherry picked from commit 5f11478ce7fda826d399530af4c5ca96c592f144)
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2023-02-24-17-59-39.gh-issue-102126.HTT8Vc.rst | 1 | ||||
-rw-r--r-- | Python/pystate.c | 12 |
2 files changed, 11 insertions, 2 deletions
diff --git a/Misc/NEWS.d/next/Core and Builtins/2023-02-24-17-59-39.gh-issue-102126.HTT8Vc.rst b/Misc/NEWS.d/next/Core and Builtins/2023-02-24-17-59-39.gh-issue-102126.HTT8Vc.rst new file mode 100644 index 00000000000..68c43688c3d --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2023-02-24-17-59-39.gh-issue-102126.HTT8Vc.rst @@ -0,0 +1 @@ +Fix deadlock at shutdown when clearing thread states if any finalizer tries to acquire the runtime head lock. Patch by Kumar Aditya. diff --git a/Python/pystate.c b/Python/pystate.c index 56c184e43ae..300b4005f01 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -258,11 +258,19 @@ _PyInterpreterState_Clear(_PyRuntimeState *runtime, PyInterpreterState *interp) PyErr_Clear(); } + // Clear the current/main thread state last. HEAD_LOCK(runtime); - for (PyThreadState *p = interp->tstate_head; p != NULL; p = p->next) { + PyThreadState *p = interp->tstate_head; + HEAD_UNLOCK(runtime); + while (p != NULL) { + // See https://github.com/python/cpython/issues/102126 + // Must be called without HEAD_LOCK held as it can deadlock + // if any finalizer tries to acquire that lock. PyThreadState_Clear(p); + HEAD_LOCK(runtime); + p = p->next; + HEAD_UNLOCK(runtime); } - HEAD_UNLOCK(runtime); Py_CLEAR(interp->audit_hooks); |