antoine.pitrou
2008-09-06 23:00:03 UTC
Author: antoine.pitrou
Date: Sun Sep 7 01:00:03 2008
New Revision: 66274
Log:
Issue #874900: fix behaviour of threading module after a fork.
Reviewed by Gregory P. Smith.
Modified:
python/branches/py3k/Lib/test/test_threading.py
python/branches/py3k/Lib/threading.py
python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Lib/test/test_threading.py
==============================================================================
--- python/branches/py3k/Lib/test/test_threading.py (original)
+++ python/branches/py3k/Lib/test/test_threading.py Sun Sep 7 01:00:03 2008
@@ -347,6 +347,9 @@
def joiningfunc(mainthread):
mainthread.join()
print('end of thread')
+ # stdout is fully buffered because not a tty, we have to flush
+ # before exit.
+ sys.stdout.flush()
\n""" + script
import subprocess
@@ -388,8 +391,7 @@
"""
self._run_and_join(script)
- # XXX This test hangs!
- def Xtest_3_join_in_forked_from_thread(self):
+ def test_3_join_in_forked_from_thread(self):
# 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.
import os
Modified: python/branches/py3k/Lib/threading.py
==============================================================================
--- python/branches/py3k/Lib/threading.py (original)
+++ python/branches/py3k/Lib/threading.py Sun Sep 7 01:00:03 2008
@@ -835,16 +835,19 @@
new_active = {}
current = current_thread()
with _active_limbo_lock:
- for ident, thread in _active.items():
+ for thread in _active.values():
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
else:
# All the others are already stopped.
# We don't call _Thread__stop() because it tries to acquire
# thread._Thread__block which could also have been held while
# we forked.
- thread._Thread__stopped = True
+ thread._stopped = True
_limbo.clear()
_active.clear()
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Sun Sep 7 01:00:03 2008
@@ -90,6 +90,8 @@
Library
-------
+- Issue #874900: fix behaviour of threading module after a fork.
+
- Issue #3535: zipfile couldn't read some zip files larger than 2GB.
- Issue #3776: Deprecate the bsddb package for removal in 3.0.
Date: Sun Sep 7 01:00:03 2008
New Revision: 66274
Log:
Issue #874900: fix behaviour of threading module after a fork.
Reviewed by Gregory P. Smith.
Modified:
python/branches/py3k/Lib/test/test_threading.py
python/branches/py3k/Lib/threading.py
python/branches/py3k/Misc/NEWS
Modified: python/branches/py3k/Lib/test/test_threading.py
==============================================================================
--- python/branches/py3k/Lib/test/test_threading.py (original)
+++ python/branches/py3k/Lib/test/test_threading.py Sun Sep 7 01:00:03 2008
@@ -347,6 +347,9 @@
def joiningfunc(mainthread):
mainthread.join()
print('end of thread')
+ # stdout is fully buffered because not a tty, we have to flush
+ # before exit.
+ sys.stdout.flush()
\n""" + script
import subprocess
@@ -388,8 +391,7 @@
"""
self._run_and_join(script)
- # XXX This test hangs!
- def Xtest_3_join_in_forked_from_thread(self):
+ def test_3_join_in_forked_from_thread(self):
# 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.
import os
Modified: python/branches/py3k/Lib/threading.py
==============================================================================
--- python/branches/py3k/Lib/threading.py (original)
+++ python/branches/py3k/Lib/threading.py Sun Sep 7 01:00:03 2008
@@ -835,16 +835,19 @@
new_active = {}
current = current_thread()
with _active_limbo_lock:
- for ident, thread in _active.items():
+ for thread in _active.values():
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
else:
# All the others are already stopped.
# We don't call _Thread__stop() because it tries to acquire
# thread._Thread__block which could also have been held while
# we forked.
- thread._Thread__stopped = True
+ thread._stopped = True
_limbo.clear()
_active.clear()
Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS (original)
+++ python/branches/py3k/Misc/NEWS Sun Sep 7 01:00:03 2008
@@ -90,6 +90,8 @@
Library
-------
+- Issue #874900: fix behaviour of threading module after a fork.
+
- Issue #3535: zipfile couldn't read some zip files larger than 2GB.
- Issue #3776: Deprecate the bsddb package for removal in 3.0.