fix deadlock issue
This commit is contained in:
parent
e36d6e7112
commit
9bf1f8f3bb
|
@ -0,0 +1,62 @@
|
|||
|
||||
# HG changeset patch
|
||||
# User Charles-François Natali <neologix@free.fr>
|
||||
# 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
|
||||
}
|
||||
|
11
python.spec
11
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 <tomspur@fedoraproject.org> - 2.7.2-20
|
||||
- fix deadlock issue (#787712)
|
||||
|
||||
* Fri Feb 17 2012 Toshio Kuratomi <toshio@fedoraproject.org> - 2.7.2-19
|
||||
- Obsolete python-sqlite2
|
||||
|
||||
|
|
Loading…
Reference in New Issue