[Python-checkins] cpython (merge 3.2 -> default): Merge.
charles-francois.natali
python-checkins at python.org
Thu Feb 2 20:39:21 CET 2012
http://hg.python.org/cpython/rev/14eaa5970500
changeset: 74734:14eaa5970500
parent: 74727:8b591a86fc91
parent: 74733:5727d3398996
user: Charles-François Natali <neologix at free.fr>
date: Thu Feb 02 20:38:10 2012 +0100
summary:
Merge.
files:
Lib/test/test_threading.py | 23 +++++++++++++++++++++++
Modules/signalmodule.c | 4 +++-
2 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -674,6 +674,29 @@
rc, out, err = assert_python_ok('-c', script)
self.assertFalse(err)
+ @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()")
+ def test_reinit_tls_after_fork(self):
+ # Issue #13817: fork() would deadlock in a multithreaded program with
+ # the ad-hoc TLS implementation.
+
+ def do_fork_and_wait():
+ # just fork a child process and wait it
+ pid = os.fork()
+ if pid > 0:
+ os.waitpid(pid, 0)
+ else:
+ os._exit(0)
+
+ # start a bunch of threads that will fork() child processes
+ threads = []
+ for i in range(16):
+ t = threading.Thread(target=do_fork_and_wait)
+ threads.append(t)
+ t.start()
+
+ for t in threads:
+ t.join()
+
class ThreadingExceptionTests(BaseTestCase):
# A RuntimeError should be raised if Thread.start() is called
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -1403,12 +1403,14 @@
PyOS_AfterFork(void)
{
#ifdef WITH_THREAD
+ /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API
+ * can be called safely. */
+ PyThread_ReInitTLS();
_PyGILState_Reinit();
PyEval_ReInitThreads();
main_thread = PyThread_get_thread_ident();
main_pid = getpid();
_PyImport_ReInitLock();
- PyThread_ReInitTLS();
#endif
}
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list