diff -r 36af3566b67a Lib/test/test_thread.py --- a/Lib/test/test_thread.py Thu Nov 03 15:38:58 2016 +0200 +++ b/Lib/test/test_thread.py Fri Nov 04 10:31:33 2016 -0400 @@ -4,6 +4,7 @@ from test import support thread = support.import_module('_thread') import time +import signal import sys import weakref @@ -147,6 +148,34 @@ time.sleep(0.01) self.assertIn("Traceback", stderr.getvalue()) + @unittest.skipUnless(hasattr(signal, "setitimer"), "requires setitimer()") + def test_interrupt_main(self): + + # timeout test after 0.1 seconds + signal.signal(signal.SIGALRM, lambda *args: self.fail("timeout")) + signal.setitimer(signal.ITIMER_REAL, 0.1) + + # lock: held before interrupt_main(), released when interrupt received + lock = thread.allocate_lock() + signal.signal(signal.SIGINT, lambda *args: lock.release()) + + # acquire lock and interrupt main from this thread + lock.acquire() + thread.interrupt_main() + + # acquire lock and interrupt main from a sub-thread + while not lock.acquire(0): + time.sleep(0.01) + thread.start_new_thread(thread.interrupt_main, ()) + + # verify and clear state + while lock.locked(): + time.sleep(0.01) + + signal.signal(signal.SIGINT, signal.SIG_DFL) + signal.setitimer(signal.ITIMER_REAL, 0) + signal.signal(signal.SIGALRM, signal.SIG_DFL) + class Barrier: def __init__(self, num_threads):