From 91012fe9b58b9dff2298aad453804023d557447b Mon Sep 17 00:00:00 2001 From: Brett Cannon Date: Fri, 13 Jun 2003 23:56:32 +0000 Subject: Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly. --- Lib/dummy_thread.py | 16 ++++++++++++---- Lib/test/test_dummy_thread.py | 5 +++++ 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Lib/dummy_thread.py b/Lib/dummy_thread.py index 7da51b9..fb3abbf 100644 --- a/Lib/dummy_thread.py +++ b/Lib/dummy_thread.py @@ -44,14 +44,17 @@ def start_new_thread(function, args, kwargs={}): raise TypeError("2nd arg must be a tuple") if type(kwargs) != type(dict()): raise TypeError("3rd arg must be a dict") + global _main + _main = False try: function(*args, **kwargs) except SystemExit: pass except: _traceback.print_exc() + _main = True + global _interrupt if _interrupt: - global _interrupt _interrupt = False raise KeyboardInterrupt @@ -122,11 +125,16 @@ class LockType(object): def locked(self): return self.locked_status - +# Used to signal that interrupt_main was called in a "thread" _interrupt = False +# True when not executing in a "thread" +_main = True def interrupt_main(): """Set _interrupt flag to True to have start_new_thread raise KeyboardInterrupt upon exiting.""" - global _interrupt - _interrupt = True + if _main: + raise KeyboardInterrupt + else: + global _interrupt + _interrupt = True diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py index d437cb1..3e79f8d 100644 --- a/Lib/test/test_dummy_thread.py +++ b/Lib/test/test_dummy_thread.py @@ -109,6 +109,11 @@ class MiscTests(unittest.TestCase): _thread.interrupt_main() self.failUnlessRaises(KeyboardInterrupt, _thread.start_new_thread, call_interrupt, tuple()) + + def test_interrupt_in_main(self): + # Make sure that if interrupt_main is called in main threat that + # KeyboardInterrupt is raised instantly. + self.failUnlessRaises(KeyboardInterrupt, _thread.interrupt_main) class ThreadTests(unittest.TestCase): """Test thread creation.""" -- cgit v0.12