diff --git a/python-3.2.2-fork-deadlock.patch b/python-3.2.2-fork-deadlock.patch new file mode 100644 index 0000000..6b1bcff --- /dev/null +++ b/python-3.2.2-fork-deadlock.patch @@ -0,0 +1,62 @@ + +# HG changeset patch +# User Charles-François Natali +# Date 1328209039 -3600 +# Node ID c3649173d093ce3bb2f887c1b4c3207196f1f453 +# Parent 0b8917fc6db55d371573398c2ae29b120be40a19 +Issue #13817: After fork(), reinit the ad-hoc TLS implementation earlier to fix +a random deadlock when fork() is called in a multithreaded process in debug +mode, and make PyOS_AfterFork() more robust. + +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 +@@ -635,6 +635,29 @@ class ThreadJoinOnShutdown(BaseTestCase) + output = "end of worker thread\nend of main thread\n" + self.assertScriptHasOutput(script, output) + ++ @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 +@@ -976,11 +976,13 @@ void + 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 + } + diff --git a/python.spec b/python.spec index d82a615..b39ebd1 100644 --- a/python.spec +++ b/python.spec @@ -108,7 +108,7 @@ Summary: An interpreted, interactive, object-oriented programming language Name: %{python} # Remember to also rebase python-docs when changing this: Version: 2.7.2 -Release: 19%{?dist} +Release: 20%{?dist} License: Python Group: Development/Languages Requires: %{python}-libs%{?_isa} = %{version}-%{release} @@ -601,6 +601,11 @@ Patch147: 00147-add-debug-malloc-stats.patch # Taken from upstream http://bugs.python.org/issue13007 (rhbz#742242) Patch148: 00148-gdbm-1.9-magic-values.patch +# Fix deadlock in fork: +# https://bugzilla.redhat.com/show_bug.cgi?id=787712 +# http://bugs.python.org/issue13817 +Patch151: python-3.2.2-fork-deadlock.patch + # python3.spec's # Patch149: 00149-backport-issue11254-pycache-bytecompilation-fix.patch # is not relevant for Python 2 @@ -913,6 +918,7 @@ done %patch147 -p1 %patch148 -p1 # 00149: not for python 2 +%patch151 -p1 # This shouldn't be necesarry, but is right now (2.2a3) @@ -1741,6 +1747,9 @@ rm -fr %{buildroot} # ====================================================== %changelog +* Sat Feb 25 2012 Thomas Spura - 2.7.2-20 +- fix deadlock issue (#787712) + * Fri Feb 17 2012 Toshio Kuratomi - 2.7.2-19 - Obsolete python-sqlite2