From 5162e299203bdfe6c687db928ba7df1857b324c3 Mon Sep 17 00:00:00 2001 From: Tyler Kennedy Date: Fri, 25 Jul 2025 10:51:30 -0400 Subject: [PATCH] gh-130522: Fix unraisable TypeError in threading at interpreter shutdown (GH-131537) (cherry picked from commit cb93b6fc5ea525f8075cb53ec373356fec63903a) Co-authored-by: Tyler Kennedy Co-authored-by: Peter Bierma --- Lib/test/test_threading.py | 17 +++++++++++++++++ Lib/threading.py | 2 +- ...25-07-25-09-21-56.gh-issue-130522.Crwq68.rst | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2025-07-25-09-21-56.gh-issue-130522.Crwq68.rst diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index c07b8133f0a2d1..e468fcd7601c15 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -1993,6 +1993,23 @@ def modify_file(): t.start() t.join() + def test_dummy_thread_on_interpreter_shutdown(self): + # GH-130522: When `threading` held a reference to itself and then a + # _DummyThread() object was created, destruction of the dummy thread + # would emit an unraisable exception at shutdown, due to a lock being + # destroyed. + code = """if True: + import sys + import threading + + threading.x = sys.modules[__name__] + x = threading._DummyThread() + """ + rc, out, err = assert_python_ok("-c", code) + self.assertEqual(rc, 0) + self.assertEqual(out, b"") + self.assertEqual(err, b"") + class ThreadRunFail(threading.Thread): def run(self): diff --git a/Lib/threading.py b/Lib/threading.py index 2a65f9a7aa3028..79b753d983aaaf 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -1421,7 +1421,7 @@ def __init__(self, dummy_thread): # the related _DummyThread will be kept forever! _thread_local_info._track_dummy_thread_ref = self - def __del__(self): + def __del__(self, _active_limbo_lock=_active_limbo_lock, _active=_active): with _active_limbo_lock: if _active.get(self._tident) is self._dummy_thread: _active.pop(self._tident, None) diff --git a/Misc/NEWS.d/next/Library/2025-07-25-09-21-56.gh-issue-130522.Crwq68.rst b/Misc/NEWS.d/next/Library/2025-07-25-09-21-56.gh-issue-130522.Crwq68.rst new file mode 100644 index 00000000000000..6c2246631dda9e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-07-25-09-21-56.gh-issue-130522.Crwq68.rst @@ -0,0 +1,2 @@ +Fix unraisable :exc:`TypeError` raised during :term:`interpreter shutdown` +in the :mod:`threading` module.