[3.14] gh-130522: Fix unraisable TypeError in threading at interpreter shutdown (GH-131537) (#137105)
Some checks are pending
Tests / Windows MSI (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Check if the ABI has changed (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run

Co-authored-by: Tyler Kennedy <tk@tkte.ch>
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
Miss Islington (bot) 2025-08-04 15:01:39 +02:00 committed by GitHub
parent 134ca903b3
commit f4870086ba
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 20 additions and 1 deletions

View file

@ -1993,6 +1993,23 @@ class ThreadingExceptionTests(BaseTestCase):
t.start() t.start()
t.join() 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): class ThreadRunFail(threading.Thread):
def run(self): def run(self):

View file

@ -1421,7 +1421,7 @@ class _DeleteDummyThreadOnDel:
# the related _DummyThread will be kept forever! # the related _DummyThread will be kept forever!
_thread_local_info._track_dummy_thread_ref = self _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: with _active_limbo_lock:
if _active.get(self._tident) is self._dummy_thread: if _active.get(self._tident) is self._dummy_thread:
_active.pop(self._tident, None) _active.pop(self._tident, None)

View file

@ -0,0 +1,2 @@
Fix unraisable :exc:`TypeError` raised during :term:`interpreter shutdown`
in the :mod:`threading` module.