mirror of
https://github.com/python/cpython.git
synced 2025-10-16 19:57:59 +00:00
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. ........
This commit is contained in:
parent
2e510fb920
commit
7d2ff884ee
5 changed files with 130 additions and 8 deletions
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue