mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
Issue #10527: Use poll() instead of select() for multiprocessing pipes
This commit is contained in:
parent
182d7cd531
commit
ad1d5f908a
2 changed files with 35 additions and 0 deletions
|
@ -199,6 +199,8 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #10527: Use poll() instead of select() for multiprocessing pipes.
|
||||
|
||||
- Issue #9720: zipfile now writes correct local headers for files larger than
|
||||
4 GiB.
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue