diff options
author | Richard Oudkerk <shibturn@gmail.com> | 2013-01-15 01:01:01 (GMT) |
---|---|---|
committer | Richard Oudkerk <shibturn@gmail.com> | 2013-01-15 01:01:01 (GMT) |
commit | ad1d5f908a51e1c6fd487e31d6f6aab98bae5c00 (patch) | |
tree | da987b98dad77466619ce767e12ba88b3e96888c /Modules | |
parent | 182d7cd531e565bfbd9e248290d6f868c688bf33 (diff) | |
download | cpython-ad1d5f908a51e1c6fd487e31d6f6aab98bae5c00.zip cpython-ad1d5f908a51e1c6fd487e31d6f6aab98bae5c00.tar.gz cpython-ad1d5f908a51e1c6fd487e31d6f6aab98bae5c00.tar.bz2 |
Issue #10527: Use poll() instead of select() for multiprocessing pipes
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_multiprocessing/socket_connection.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Modules/_multiprocessing/socket_connection.c b/Modules/_multiprocessing/socket_connection.c index 1169c0a..66bc377 100644 --- a/Modules/_multiprocessing/socket_connection.c +++ b/Modules/_multiprocessing/socket_connection.c @@ -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) @@ -158,6 +162,34 @@ conn_recv_string(ConnectionObject *conn, char *buffer, 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; @@ -193,6 +225,7 @@ conn_poll(ConnectionObject *conn, double timeout, PyThreadState *_save) assert(res == 0); return FALSE; } +#endif } /* |