summaryrefslogtreecommitdiffstats
path: root/Lib/test
diff options
context:
space:
mode:
authorChristian Heimes <christian@cheimes.de>2007-11-30 14:35:04 (GMT)
committerChristian Heimes <christian@cheimes.de>2007-11-30 14:35:04 (GMT)
commit7d2ff884eeb636fcd30ebd2f9886c4b46e8545bc (patch)
tree464092cc4b9f9ef6b4a32c7fb5d5bfbfb1131c9d /Lib/test
parent2e510fb9202977d93cc364e0c661769ea4a8cbbc (diff)
downloadcpython-7d2ff884eeb636fcd30ebd2f9886c4b46e8545bc.zip
cpython-7d2ff884eeb636fcd30ebd2f9886c4b46e8545bc.tar.gz
cpython-7d2ff884eeb636fcd30ebd2f9886c4b46e8545bc.tar.bz2
Merged revisions 59226-59233 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r59228 | amaury.forgeotdarc | 2007-11-29 21:24:36 +0100 (Thu, 29 Nov 2007) | 4 lines vc2008: Move python.vcproj first in the solution file, so that it becomes the default startup project when opening the file for the first time. ........ r59230 | georg.brandl | 2007-11-30 00:00:03 +0100 (Fri, 30 Nov 2007) | 3 lines Add more examples to the wsgiref docs. From GHOP by Josip Dzolonga. ........ r59231 | amaury.forgeotdarc | 2007-11-30 00:35:25 +0100 (Fri, 30 Nov 2007) | 7 lines Issue #1402: PyInterpreterState_Clear() may still invoke user code (in deallocation of running threads, for example), so the PyGILState_Release() function must still be functional. On the other hand, _PyGILState_Fini() only frees memory, and can be called later. Backport candidate, but only after some experts comment on it. ........
Diffstat (limited to 'Lib/test')
-rw-r--r--Lib/test/test_threading.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index b76cea1..e5ed201 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -202,6 +202,40 @@ class ThreadTests(unittest.TestCase):
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.