diff options
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/selectmodule.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5305523..0f353fb 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -525,20 +525,14 @@ poll_poll(pollObject *self, PyObject *args) PyObject *result_list = NULL, *timeout_obj = NULL; int poll_result, i, j; PyObject *value = NULL, *num = NULL; - _PyTime_t timeout, ms, deadline; + _PyTime_t timeout = -1, ms = -1, deadline = 0; int async_err = 0; if (!PyArg_ParseTuple(args, "|O:poll", &timeout_obj)) { return NULL; } - /* Check values for timeout */ - if (timeout_obj == NULL || timeout_obj == Py_None) { - timeout = -1; - ms = -1; - deadline = 0; /* initialize to prevent gcc warning */ - } - else { + if (timeout_obj != NULL && timeout_obj != Py_None) { if (_PyTime_FromMillisecondsObject(&timeout, timeout_obj, _PyTime_ROUND_TIMEOUT) < 0) { if (PyErr_ExceptionMatches(PyExc_TypeError)) { @@ -554,7 +548,20 @@ poll_poll(pollObject *self, PyObject *args) return NULL; } - deadline = _PyTime_GetMonotonicClock() + timeout; + if (timeout >= 0) { + deadline = _PyTime_GetMonotonicClock() + timeout; + } + } + + /* On some OSes, typically BSD-based ones, the timeout parameter of the + poll() syscall, when negative, must be exactly INFTIM, where defined, + or -1. See issue 31334. */ + if (ms < 0) { +#ifdef INFTIM + ms = INFTIM; +#else + ms = -1; +#endif } /* Avoid concurrent poll() invocation, issue 8865 */ |