mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly.
This commit is contained in:
parent
4e64d78bbb
commit
91012fe9b5
2 changed files with 17 additions and 4 deletions
|
|
@ -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()
|
||||
if _interrupt:
|
||||
_main = True
|
||||
global _interrupt
|
||||
if _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."""
|
||||
if _main:
|
||||
raise KeyboardInterrupt
|
||||
else:
|
||||
global _interrupt
|
||||
_interrupt = True
|
||||
|
|
|
|||
|
|
@ -110,6 +110,11 @@ class MiscTests(unittest.TestCase):
|
|||
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."""
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue