2.7.3-27: port _multiprocessing.Connection to use the "poll" syscall (patch 172; rhbz#849992)
* Thu Feb 21 2013 David Malcolm <dmalcolm@redhat.com> - 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)
This commit is contained in:
parent
c9c381fa33
commit
2938c66197
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
22
python.spec
22
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 <dmalcolm@redhat.com> - 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 <dmalcolm@redhat.com> - 2.7.3-26
|
||||
- raise correct exception in os.urandom() when /dev/urandom is missing
|
||||
(patch 171; rhbz#907383)
|
||||
|
|
Loading…
Reference in New Issue