# 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
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")
pass
except:
_traceback.print_exc()
+ if _interrupt:
+ global _interrupt
+ _interrupt = False
+ raise KeyboardInterrupt
def exit():
"""Dummy implementation of thread.exit()."""
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
"_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."""
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)