summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/dummy_thread.py16
-rw-r--r--Lib/test/test_dummy_thread.py5
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."""