Issue #874900: fix behaviour of threading module after a fork.
Reviewed by Gregory P. Smith.
This commit is contained in:
parent
0a608fdaac
commit
5fe291f817
@ -347,6 +347,9 @@ class ThreadJoinOnShutdown(unittest.TestCase):
|
|||||||
def joiningfunc(mainthread):
|
def joiningfunc(mainthread):
|
||||||
mainthread.join()
|
mainthread.join()
|
||||||
print('end of thread')
|
print('end of thread')
|
||||||
|
# stdout is fully buffered because not a tty, we have to flush
|
||||||
|
# before exit.
|
||||||
|
sys.stdout.flush()
|
||||||
\n""" + script
|
\n""" + script
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -388,8 +391,7 @@ class ThreadJoinOnShutdown(unittest.TestCase):
|
|||||||
"""
|
"""
|
||||||
self._run_and_join(script)
|
self._run_and_join(script)
|
||||||
|
|
||||||
# XXX This test hangs!
|
def test_3_join_in_forked_from_thread(self):
|
||||||
def Xtest_3_join_in_forked_from_thread(self):
|
|
||||||
# Like the test above, but fork() was called from a worker thread
|
# Like the test above, but fork() was called from a worker thread
|
||||||
# In the forked process, the main Thread object must be marked as stopped.
|
# In the forked process, the main Thread object must be marked as stopped.
|
||||||
import os
|
import os
|
||||||
|
@ -835,16 +835,19 @@ def _after_fork():
|
|||||||
new_active = {}
|
new_active = {}
|
||||||
current = current_thread()
|
current = current_thread()
|
||||||
with _active_limbo_lock:
|
with _active_limbo_lock:
|
||||||
for ident, thread in _active.items():
|
for thread in _active.values():
|
||||||
if thread is current:
|
if thread is current:
|
||||||
# There is only one active thread.
|
# There is only one active thread. We reset the ident to
|
||||||
|
# its new value since it can have changed.
|
||||||
|
ident = _get_ident()
|
||||||
|
thread._ident = ident
|
||||||
new_active[ident] = thread
|
new_active[ident] = thread
|
||||||
else:
|
else:
|
||||||
# All the others are already stopped.
|
# All the others are already stopped.
|
||||||
# We don't call _Thread__stop() because it tries to acquire
|
# We don't call _Thread__stop() because it tries to acquire
|
||||||
# thread._Thread__block which could also have been held while
|
# thread._Thread__block which could also have been held while
|
||||||
# we forked.
|
# we forked.
|
||||||
thread._Thread__stopped = True
|
thread._stopped = True
|
||||||
|
|
||||||
_limbo.clear()
|
_limbo.clear()
|
||||||
_active.clear()
|
_active.clear()
|
||||||
|
@ -90,6 +90,8 @@ C API
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #874900: fix behaviour of threading module after a fork.
|
||||||
|
|
||||||
- Issue #3535: zipfile couldn't read some zip files larger than 2GB.
|
- Issue #3535: zipfile couldn't read some zip files larger than 2GB.
|
||||||
|
|
||||||
- Issue #3776: Deprecate the bsddb package for removal in 3.0.
|
- Issue #3776: Deprecate the bsddb package for removal in 3.0.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user