From 2938c661975c582a54dca69a7dc212f12673afa8 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Feb 21 2013 22:11:13 +0000 Subject: 2.7.3-27: port _multiprocessing.Connection to use the "poll" syscall (patch 172; rhbz#849992) * Thu Feb 21 2013 David Malcolm - 2.7.3-27 - port _multiprocessing.Connection.poll() to use the "poll" syscall, rather than "select", allowing large numbers of subprocesses (patch 172; rhbz#849992) --- diff --git a/00172-use-poll-for-multiprocessing-socket-connection.patch b/00172-use-poll-for-multiprocessing-socket-connection.patch new file mode 100644 index 0000000..5b2f626 --- /dev/null +++ b/00172-use-poll-for-multiprocessing-socket-connection.patch @@ -0,0 +1,87 @@ +diff -up Python-2.7.3/Doc/library/asyncore.rst.use-poll-for-multiprocessing-socket-connection Python-2.7.3/Doc/library/asyncore.rst +--- Python-2.7.3/Doc/library/asyncore.rst.use-poll-for-multiprocessing-socket-connection 2013-02-21 15:21:41.204812979 -0500 ++++ Python-2.7.3/Doc/library/asyncore.rst 2013-02-21 15:21:41.211812976 -0500 +@@ -318,13 +318,10 @@ connections and dispatches the incoming + + def handle_accept(self): + pair = self.accept() +- if pair is None: +- pass +- else: ++ if pair is not None: + sock, addr = pair + print 'Incoming connection from %s' % repr(addr) + handler = EchoHandler(sock) + + server = EchoServer('localhost', 8080) + asyncore.loop() +- +diff -up Python-2.7.3/Lib/multiprocessing/connection.py.use-poll-for-multiprocessing-socket-connection Python-2.7.3/Lib/multiprocessing/connection.py +diff -up Python-2.7.3/Lib/test/test_multiprocessing.py.use-poll-for-multiprocessing-socket-connection Python-2.7.3/Lib/test/test_multiprocessing.py +--- Python-2.7.3/Lib/test/test_multiprocessing.py.use-poll-for-multiprocessing-socket-connection 2013-02-21 15:21:41.199812979 -0500 ++++ Python-2.7.3/Lib/test/test_multiprocessing.py 2013-02-21 15:21:41.208812978 -0500 +@@ -1452,6 +1452,7 @@ class _TestConnection(BaseTestCase): + self.assertTimingAlmostEqual(poll.elapsed, TIMEOUT1) + + conn.send(None) ++ time.sleep(.1) + + self.assertEqual(poll(TIMEOUT1), True) + self.assertTimingAlmostEqual(poll.elapsed, 0) +diff -up Python-2.7.3/Modules/_multiprocessing/socket_connection.c.use-poll-for-multiprocessing-socket-connection Python-2.7.3/Modules/_multiprocessing/socket_connection.c +--- Python-2.7.3/Modules/_multiprocessing/socket_connection.c.use-poll-for-multiprocessing-socket-connection 2013-02-21 15:21:41.201812979 -0500 ++++ Python-2.7.3/Modules/_multiprocessing/socket_connection.c 2013-02-21 15:21:41.215812978 -0500 +@@ -8,6 +8,10 @@ + + #include "multiprocessing.h" + ++#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) ++# include "poll.h" ++#endif ++ + #ifdef MS_WINDOWS + # define WRITE(h, buffer, length) send((SOCKET)h, buffer, length, 0) + # define READ(h, buffer, length) recv((SOCKET)h, buffer, length, 0) +@@ -155,6 +159,34 @@ conn_recv_string(ConnectionObject *conn, + static int + conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save) + { ++#if defined(HAVE_POLL) && !defined(HAVE_BROKEN_POLL) ++ int res; ++ struct pollfd p; ++ ++ p.fd = (int)conn->handle; ++ p.events = POLLIN | POLLPRI; ++ p.revents = 0; ++ ++ if (timeout < 0) { ++ res = poll(&p, 1, -1); ++ } else { ++ res = poll(&p, 1, (int)(timeout * 1000 + 0.5)); ++ } ++ ++ if (res < 0) { ++ return MP_SOCKET_ERROR; ++ } else if (p.revents & (POLLNVAL|POLLERR)) { ++ Py_BLOCK_THREADS ++ PyErr_SetString(PyExc_IOError, "poll() gave POLLNVAL or POLLERR"); ++ Py_UNBLOCK_THREADS ++ return MP_EXCEPTION_HAS_BEEN_SET; ++ } else if (p.revents != 0) { ++ return TRUE; ++ } else { ++ assert(res == 0); ++ return FALSE; ++ } ++#else + int res; + fd_set rfds; + +@@ -190,6 +222,7 @@ conn_poll(ConnectionObject *conn, double + assert(res == 0); + return FALSE; + } ++#endif + } + + /* diff --git a/python.spec b/python.spec index 1309c89..71ddbfd 100644 --- a/python.spec +++ b/python.spec @@ -106,7 +106,7 @@ Summary: An interpreted, interactive, object-oriented programming language Name: %{python} # Remember to also rebase python-docs when changing this: Version: 2.7.3 -Release: 26%{?dist} +Release: 27%{?dist} License: Python Group: Development/Languages Requires: %{python}-libs%{?_isa} = %{version}-%{release} @@ -792,6 +792,20 @@ Patch170: 00170-gc-assertions.patch # (rhbz#907383; http://bugs.python.org/issue15340) Patch171: 00171-raise-correct-exception-when-dev-urandom-is-missing.patch +# 00172 # +# Port _multiprocessing.Connection.poll() to use the "poll" syscall, rather +# than "select", allowing large numbers of subprocesses +# +# Based on this sequence of upstream patches to 2.7: +# http://hg.python.org/cpython/rev/c5c27b84d7af/ +# http://hg.python.org/cpython/rev/7cf4ea64f603/ +# http://hg.python.org/cpython/rev/da5e520a7ba5/ +# http://hg.python.org/cpython/rev/f07435fa6736/ +# +#(rhbz#849992; http://bugs.python.org/issue10527) +Patch172: 00172-use-poll-for-multiprocessing-socket-connection.patch + + # (New patches go here ^^^) # # When adding new patches to "python" and "python3" in Fedora 17 onwards, @@ -1130,6 +1144,7 @@ mv Modules/cryptmodule.c Modules/_cryptmodule.c %patch169 -p1 %patch170 -p1 %patch171 -p1 -b .raise-correct-exception-when-dev-urandom-is-missing +%patch172 -p1 # This shouldn't be necesarry, but is right now (2.2a3) @@ -1962,6 +1977,11 @@ rm -fr %{buildroot} # ====================================================== %changelog +* Thu Feb 21 2013 David Malcolm - 2.7.3-27 +- port _multiprocessing.Connection.poll() to use the "poll" syscall, rather +than "select", allowing large numbers of subprocesses (patch 172; +rhbz#849992) + * Thu Feb 21 2013 David Malcolm - 2.7.3-26 - raise correct exception in os.urandom() when /dev/urandom is missing (patch 171; rhbz#907383)