summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2003-06-13 23:56:32 (GMT)
committerBrett Cannon <bcannon@gmail.com>2003-06-13 23:56:32 (GMT)
commit91012fe9b58b9dff2298aad453804023d557447b (patch)
tree28c6a48ff21d97783760a06eee1e1db62e2b21fe /Lib
parent4e64d78bbb961672ee324db234c70320ed4db6d5 (diff)
downloadcpython-91012fe9b58b9dff2298aad453804023d557447b.zip
cpython-91012fe9b58b9dff2298aad453804023d557447b.tar.gz
cpython-91012fe9b58b9dff2298aad453804023d557447b.tar.bz2
Cause calling interrupt_main in main thread raise KeyboardInterrupt instantly.
Diffstat (limited to 'Lib')
-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."""