summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/dummy_thread.py18
-rw-r--r--Lib/test/test_dummy_thread.py8
-rw-r--r--Misc/NEWS3
3 files changed, 28 insertions, 1 deletions
diff --git a/Lib/dummy_thread.py b/Lib/dummy_thread.py
index e4bf05a..7da51b9 100644
--- a/Lib/dummy_thread.py
+++ b/Lib/dummy_thread.py
@@ -17,7 +17,7 @@ __email__ = "brett@python.org"
# Exports only things specified by thread documentation
# (skipping obsolete synonyms allocate(), start_new(), exit_thread())
__all__ = ['error', 'start_new_thread', 'exit', 'get_ident', 'allocate_lock',
- 'LockType']
+ 'interrupt_main', 'LockType']
import traceback as _traceback
@@ -36,6 +36,9 @@ def start_new_thread(function, args, kwargs={}):
caught and nothing is done; all other exceptions are printed out
by using traceback.print_exc().
+ If the executed function calls interrupt_main the KeyboardInterrupt will be
+ raised when the function returns.
+
"""
if type(args) != type(tuple()):
raise TypeError("2nd arg must be a tuple")
@@ -47,6 +50,10 @@ def start_new_thread(function, args, kwargs={}):
pass
except:
_traceback.print_exc()
+ if _interrupt:
+ global _interrupt
+ _interrupt = False
+ raise KeyboardInterrupt
def exit():
"""Dummy implementation of thread.exit()."""
@@ -114,3 +121,12 @@ class LockType(object):
def locked(self):
return self.locked_status
+
+
+_interrupt = False
+
+def interrupt_main():
+ """Set _interrupt flag to True to have start_new_thread raise
+ KeyboardInterrupt upon exiting."""
+ global _interrupt
+ _interrupt = True
diff --git a/Lib/test/test_dummy_thread.py b/Lib/test/test_dummy_thread.py
index 0d614e1..d437cb1 100644
--- a/Lib/test/test_dummy_thread.py
+++ b/Lib/test/test_dummy_thread.py
@@ -102,6 +102,14 @@ class MiscTests(unittest.TestCase):
"_thread.LockType is not an instance of what is "
"returned by _thread.allocate_lock()")
+ def test_interrupt_main(self):
+ #Calling start_new_thread with a function that executes interrupt_main
+ # should raise KeyboardInterrupt upon completion.
+ def call_interrupt():
+ _thread.interrupt_main()
+ self.failUnlessRaises(KeyboardInterrupt, _thread.start_new_thread,
+ call_interrupt, tuple())
+
class ThreadTests(unittest.TestCase):
"""Test thread creation."""
diff --git a/Misc/NEWS b/Misc/NEWS
index d99851d..d4a8058 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -55,6 +55,9 @@ Core and builtins
Extension modules
-----------------
+- thread.interrupt_main() raises KeyboardInterrupt in the main thread.
+ dummy_thread has also been modified to try to simulate the behavior.
+
- array.array.insert() now treats negative indices as being relative
to the end of the array, just like list.insert() does. (SF bug #739313)