From: Brett Cannon Date: Fri, 13 Jun 2003 23:56:32 +0000 (+0000) Subject: Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly. X-Git-Tag: v2.3c1~457 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=91012fe9b58b9dff2298aad453804023d557447b;p=python Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly. --- diff --git a/Lib/dummy_thread.py b/Lib/dummy_thread.py index 7da51b9d4c..fb3abbf75d 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 d437cb1d3e..3e79f8d924 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."""