[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