mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +08:00
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
its first three arguments. Closes RFE #798046 .
This commit is contained in:
parent
fd4fa8801a
commit
62dba4c277
@ -32,12 +32,12 @@ polling objects.
|
||||
|
||||
\begin{funcdesc}{select}{iwtd, owtd, ewtd\optional{, timeout}}
|
||||
This is a straightforward interface to the \UNIX{} \cfunction{select()}
|
||||
system call. The first three arguments are lists of `waitable
|
||||
system call. The first three arguments are sequences of `waitable
|
||||
objects': either integers representing file descriptors or
|
||||
objects with a parameterless method named \method{fileno()} returning
|
||||
such an integer. The three lists of waitable objects are for input,
|
||||
output and `exceptional conditions', respectively. Empty lists are
|
||||
allowed, but acceptance of three empty lists is platform-dependent.
|
||||
such an integer. The three sequences of waitable objects are for input,
|
||||
output and `exceptional conditions', respectively. Empty sequences are
|
||||
allowed, but acceptance of three empty sequences is platform-dependent.
|
||||
(It is known to work on \UNIX{} but not on Windows.) The optional
|
||||
\var{timeout} argument specifies a time-out as a floating point number
|
||||
in seconds. When the \var{timeout} argument is omitted the function
|
||||
@ -49,7 +49,7 @@ subsets of the first three arguments. When the time-out is reached
|
||||
without a file descriptor becoming ready, three empty lists are
|
||||
returned.
|
||||
|
||||
Among the acceptable object types in the lists are Python file
|
||||
Among the acceptable object types in the sequences are Python file
|
||||
objects (e.g. \code{sys.stdin}, or objects returned by
|
||||
\function{open()} or \function{os.popen()}), socket objects
|
||||
returned by \function{socket.socket()}.%
|
||||
|
@ -24,6 +24,8 @@ Core and builtins
|
||||
Extension modules
|
||||
-----------------
|
||||
|
||||
- select.select() now accepts sequences for its first three arguments.
|
||||
|
||||
- cStringIO now supports the f.closed attribute.
|
||||
|
||||
- The signal module now exposes SIGRTMIN and SIGRTMAX (if available).
|
||||
|
@ -75,22 +75,29 @@ reap_obj(pylist fd2obj[FD_SETSIZE + 1])
|
||||
returns a number >= 0
|
||||
*/
|
||||
static int
|
||||
list2set(PyObject *list, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
|
||||
seq2set(PyObject *seq, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
|
||||
{
|
||||
int i;
|
||||
int max = -1;
|
||||
int index = 0;
|
||||
int len = PyList_Size(list);
|
||||
int len = -1;
|
||||
PyObject* fast_seq = NULL;
|
||||
PyObject* o = NULL;
|
||||
|
||||
fd2obj[0].obj = (PyObject*)0; /* set list to zero size */
|
||||
FD_ZERO(set);
|
||||
|
||||
fast_seq=PySequence_Fast(seq, "arguments 1-3 must be sequences");
|
||||
if (!fast_seq)
|
||||
return -1;
|
||||
|
||||
len = PySequence_Fast_GET_SIZE(fast_seq);
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
SOCKET v;
|
||||
|
||||
/* any intervening fileno() calls could decr this refcnt */
|
||||
if (!(o = PyList_GetItem(list, i)))
|
||||
if (!(o = PySequence_Fast_GET_ITEM(fast_seq, i)))
|
||||
return -1;
|
||||
|
||||
Py_INCREF(o);
|
||||
@ -121,10 +128,12 @@ list2set(PyObject *list, fd_set *set, pylist fd2obj[FD_SETSIZE + 1])
|
||||
fd2obj[index].sentinel = 0;
|
||||
fd2obj[++index].sentinel = -1;
|
||||
}
|
||||
Py_DECREF(fast_seq);
|
||||
return max+1;
|
||||
|
||||
finally:
|
||||
Py_XDECREF(o);
|
||||
Py_DECREF(fast_seq);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -229,15 +238,6 @@ select_select(PyObject *self, PyObject *args)
|
||||
tvp = &tv;
|
||||
}
|
||||
|
||||
/* sanity check first three arguments */
|
||||
if (!PyList_Check(ifdlist) ||
|
||||
!PyList_Check(ofdlist) ||
|
||||
!PyList_Check(efdlist))
|
||||
{
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"arguments 1-3 must be lists");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef SELECT_USES_HEAP
|
||||
/* Allocate memory for the lists */
|
||||
@ -251,17 +251,17 @@ select_select(PyObject *self, PyObject *args)
|
||||
return PyErr_NoMemory();
|
||||
}
|
||||
#endif /* SELECT_USES_HEAP */
|
||||
/* Convert lists to fd_sets, and get maximum fd number
|
||||
* propagates the Python exception set in list2set()
|
||||
/* Convert sequences to fd_sets, and get maximum fd number
|
||||
* propagates the Python exception set in seq2set()
|
||||
*/
|
||||
rfd2obj[0].sentinel = -1;
|
||||
wfd2obj[0].sentinel = -1;
|
||||
efd2obj[0].sentinel = -1;
|
||||
if ((imax=list2set(ifdlist, &ifdset, rfd2obj)) < 0)
|
||||
if ((imax=seq2set(ifdlist, &ifdset, rfd2obj)) < 0)
|
||||
goto finally;
|
||||
if ((omax=list2set(ofdlist, &ofdset, wfd2obj)) < 0)
|
||||
if ((omax=seq2set(ofdlist, &ofdset, wfd2obj)) < 0)
|
||||
goto finally;
|
||||
if ((emax=list2set(efdlist, &efdset, efd2obj)) < 0)
|
||||
if ((emax=seq2set(efdlist, &efdset, efd2obj)) < 0)
|
||||
goto finally;
|
||||
max = imax;
|
||||
if (omax > max) max = omax;
|
||||
@ -618,7 +618,7 @@ PyDoc_STRVAR(select_doc,
|
||||
"select(rlist, wlist, xlist[, timeout]) -> (rlist, wlist, xlist)\n\
|
||||
\n\
|
||||
Wait until one or more file descriptors are ready for some kind of I/O.\n\
|
||||
The first three arguments are lists of file descriptors to be waited for:\n\
|
||||
The first three arguments are sequences of file descriptors to be waited for:\n\
|
||||
rlist -- wait until ready for reading\n\
|
||||
wlist -- wait until ready for writing\n\
|
||||
xlist -- wait for an ``exceptional condition''\n\
|
||||
|
Loading…
Reference in New Issue
Block a user