Kaydet (Commit) 91012fe9 authored tarafından Brett Cannon's avatar Brett Cannon

Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly.

üst 4e64d78b
......@@ -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
......@@ -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."""
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment