diff options
-rw-r--r-- | Lib/dummy_thread.py | 16 | ||||
-rw-r--r-- | 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.""" |