Index: Lib/test/test_threading.py =================================================================== --- Lib/test/test_threading.py (revision 59154) +++ Lib/test/test_threading.py (working copy) @@ -202,6 +202,40 @@ t.join() # else the thread is still running, and we have no way to kill it + def test_finalize_runnning_thread(self): + # Issue 1402: the PyGILState_Ensure / _Release functions may be called + # very late on python exit: on deallocation of a running thread for + # example. + try: + import ctypes + except ImportError: + if verbose: + print("test_finalize_with_runnning_thread can't import ctypes") + return # can't do anything + + import subprocess + rc = subprocess.call([sys.executable, "-c", """if 1: + import ctypes, sys, time, thread + + # Module globals are cleared before __del__ is run + # So we save the functions in class dict + class C: + ensure = ctypes.pythonapi.PyGILState_Ensure + release = ctypes.pythonapi.PyGILState_Release + def __del__(self): + state = self.ensure() + self.release(state) + + def waitingThread(): + x = C() + time.sleep(100) + + thread.start_new_thread(waitingThread, ()) + time.sleep(1) # be sure the other thread is waiting + sys.exit(42) + """]) + self.assertEqual(rc, 42) + class ThreadingExceptionTests(unittest.TestCase): # A RuntimeError should be raised if Thread.start() is called # multiple times.