Fix deadlock on shutdown if test_current_{exception,frames} fails (#102019)

* Don't deadlock on shutdown if test_current_{exception,frames} fails

These tests spawn a thread that waits on a threading.Event. If the test fails any of its assertions, the Event won't be signaled and the thread will wait indefinitely, causing a deadlock when threading._shutdown() tries to join all outstanding threads.

Co-authored-by: Brett Simmers <bsimmers@meta.com>

* Add a news entry

* Fix whitespace

---------

Co-authored-by: Brett Simmers <bsimmers@meta.com>
Co-authored-by: Oleg Iarygin <oleg@arhadthedev.net>
This commit is contained in:
Jacob Bower 2023-02-23 14:57:06 -08:00 committed by GitHub
parent ccd98a3146
commit 0c857865e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 70 additions and 66 deletions

View File

@ -445,6 +445,7 @@ class SysModuleTest(unittest.TestCase):
t.start()
entered_g.wait()
try:
# At this point, t has finished its entered_g.set(), although it's
# impossible to guess whether it's still on that line or has moved on
# to its leave_g.wait().
@ -481,7 +482,7 @@ class SysModuleTest(unittest.TestCase):
filename, lineno, funcname, sourceline = stack[i+1]
self.assertEqual(funcname, "g456")
self.assertIn(sourceline, ["leave_g.wait()", "entered_g.set()"])
finally:
# Reap the spawned thread.
leave_g.set()
t.join()
@ -516,6 +517,7 @@ class SysModuleTest(unittest.TestCase):
t.start()
entered_g.wait()
try:
# At this point, t has finished its entered_g.set(), although it's
# impossible to guess whether it's still on that line or has moved on
# to its leave_g.wait().
@ -549,7 +551,7 @@ class SysModuleTest(unittest.TestCase):
filename, lineno, funcname, sourceline = stack[i+1]
self.assertEqual(funcname, "g456")
self.assertTrue(sourceline.startswith("if leave_g.wait("))
finally:
# Reap the spawned thread.
leave_g.set()
t.join()

View File

@ -0,0 +1,2 @@
Fix deadlock on shutdown if ``test_current_{exception,frames}`` fails. Patch
by Jacob Bower.