]> granicus.if.org Git - python/commitdiff
dummy_thread modified to have interrupt_main and to behave appropriately when
authorBrett Cannon <bcannon@gmail.com>
Fri, 13 Jun 2003 23:44:35 +0000 (23:44 +0000)
committerBrett Cannon <bcannon@gmail.com>
Fri, 13 Jun 2003 23:44:35 +0000 (23:44 +0000)
called.

Added announcement in Misc/NEWS for thread.interrupt_main and mention of
dummy_thread's change.

Lib/dummy_thread.py
Lib/test/test_dummy_thread.py
Misc/NEWS

index e4bf05a2cac4262cf6e82a2aa3b0dce62fca796d..7da51b9d4c9764998e24499e14829de2284d89d7 100644 (file)
@@ -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
index 0d614e132a8426051472f758b6cb76e33e95deec..d437cb1d3ea5f67690331da0f8863f49429f33d1 100644 (file)
@@ -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."""
 
index d99851d47afcae2c54a68aeaf1cd5aa53b2d24d8..d4a80582179ff162ebd34c73c8449eec39e1fdbd 100644 (file)
--- 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)