dummy_thread modified to have interrupt_main and to behave appropriately when
called.

Added announcement in Misc/NEWS for thread.interrupt_main and mention of
dummy_thread's change.
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 @@
 # 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 @@
     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 @@
         pass
     except:
         _traceback.print_exc()
+    if _interrupt:
+        global _interrupt
+        _interrupt = False
+        raise KeyboardInterrupt
 
 def exit():
     """Dummy implementation of thread.exit()."""
@@ -114,3 +121,12 @@
 
     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 @@
                         "_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 @@
 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)