diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-04-03 23:07:55 +0000 |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-04-03 23:07:55 +0000 |
commit | d7a265129c292f2a50d3daefd8a133fe97a3bf78 (patch) | |
tree | c8e883142a0aad5d036b03c2eb824640b2377f0f /Lib/test/test_threading.py | |
parent | 2aae1d92ebf442b08efce2bc5d090d70fb92e525 (diff) | |
download | cpython-git-d7a265129c292f2a50d3daefd8a133fe97a3bf78.tar.gz |
#1733757: the interpreter would hang on shutdown, if the function set by sys.settrace
calls threading.currentThread.
The correction somewhat improves the code, but it was close.
Many thanks to the "with" construct, which turns python code into C calls.
I wonder if it is not better to sys.settrace(None) just after
running the __main__ module and before finalization.
Diffstat (limited to 'Lib/test/test_threading.py')
-rw-r--r-- | Lib/test/test_threading.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 195c4e8f73..30aa9d5786 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -238,6 +238,35 @@ class ThreadTests(unittest.TestCase): """]) self.assertEqual(rc, 42) + def test_finalize_with_trace(self): + # Issue1733757 + # Avoid a deadlock when sys.settrace steps into threading._shutdown + import subprocess + rc = subprocess.call([sys.executable, "-c", """if 1: + import sys, threading + + # A deadlock-killer, to prevent the + # testsuite to hang forever + def killer(): + import os, time + time.sleep(2) + print 'program blocked; aborting' + os._exit(2) + t = threading.Thread(target=killer) + t.setDaemon(True) + t.start() + + # This is the trace function + def func(frame, event, arg): + threading.currentThread() + return func + + sys.settrace(func) + """]) + self.failIf(rc == 2, "interpreted was blocked") + self.failUnless(rc == 0, "Unexpected error") + + def test_enumerate_after_join(self): # Try hard to trigger #1703448: a thread is still returned in # threading.enumerate() after it has been join()ed. |