From 4e64d78bbb961672ee324db234c70320ed4db6d5 Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 13 Jun 2003 23:44:35 +0000 Subject: dummy_thread modified to have interrupt_main and to behave appropriately when called. Added announcement in Misc/NEWS for thread.interrupt_main and mention of dummy_thread's change. --- Lib/dummy_thread.py | 18 +++++++++++++++++- Lib/test/test_dummy_thread.py | 8 ++++++++ Misc/NEWS | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Lib/dummy_thread.py b/Lib/dummy_thread.py index e4bf05a..7da51b9 100644 --- a/Lib/dummy_thread.py +++ b/Lib/dummy_thread.py @@ -17,7 +17,7 @@ __email__ = "brett@python.org" # Exports only things specified by thread documentation # (skipping obsolete synonyms allocate(), start_new(), exit_thread()) __all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock', - 'LockType'] + 'interrupt_main', 'LockType'] import traceback as _traceback @@ -36,6 +36,9 @@ def start_new_thread(function, args, kwargs={}): caught and nothing is done; all other exceptions are printed out by using traceback.print_exc(). + If the executed function calls interrupt_main the KeyboardInterrupt will be + raised when the function returns. + """ if type(args) != type(tuple()): raise TypeError("2nd arg must be a tuple") @@ -47,6 +50,10 @@ def start_new_thread(function, args, kwargs={}): pass except: _traceback.print_exc() + if _interrupt: + global _interrupt + _interrupt = False + raise KeyboardInterrupt def exit(): """Dummy implementation of thread.exit().""" @@ -114,3 +121,12 @@ class LockType(object): def locked(self): return self.locked_status + + +_interrupt = False + +def interrupt_main(): + """Set _interrupt flag to True to have start_new_thread raise + KeyboardInterrupt upon exiting.""" + global _interrupt + _interrupt = True diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py index 0d614e1..d437cb1 100644 --- a/Lib/test/test_dummy_thread.py +++ b/Lib/test/test_dummy_thread.py @@ -102,6 +102,14 @@ class MiscTests(unittest.TestCase): "_thread.LockType is not an instance of what is " "returned by _thread.allocate_lock()") + def test_interrupt_main(self): + #Calling start_new_thread with a function that executes interrupt_main + # should raise KeyboardInterrupt upon completion. + def call_interrupt(): + _thread.interrupt_main() + self.failUnlessRaises(KeyboardInterrupt, _thread.start_new_thread, + call_interrupt, tuple()) + class ThreadTests(unittest.TestCase): """Test thread creation.""" diff --git a/Misc/NEWS b/Misc/NEWS index d99851d..d4a8058 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -55,6 +55,9 @@ Core and builtins Extension modules ----------------- +- thread.interrupt_main() raises KeyboardInterrupt in the main thread. + dummy_thread has also been modified to try to simulate the behavior. + - array.array.insert() now treats negative indices as being relative to the end of the array, just like list.insert() does. (SF bug #739313) -- cgit v0.12