diff options
author | Christian Heimes <christian@cheimes.de> | 2007-11-30 14:35:04 (GMT) |
---|---|---|
committer | Christian Heimes <christian@cheimes.de> | 2007-11-30 14:35:04 (GMT) |
commit | 7d2ff884eeb636fcd30ebd2f9886c4b46e8545bc (patch) | |
tree | 464092cc4b9f9ef6b4a32c7fb5d5bfbfb1131c9d /Lib/test | |
parent | 2e510fb9202977d93cc364e0c661769ea4a8cbbc (diff) | |
download | cpython-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.py | 34 |
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. |