summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/lib/libselect.tex10
-rw-r--r--Misc/NEWS2
-rw-r--r--Modules/selectmodule.c36
3 files changed, 25 insertions, 23 deletions
diff --git a/Doc/lib/libselect.tex b/Doc/lib/libselect.tex
index 803a05e..f3186c4 100644
--- a/Doc/lib/libselect.tex
+++ b/Doc/lib/libselect.tex
@@ -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()}.%
diff --git a/Misc/NEWS b/Misc/NEWS
index 1208d41..5cf8d72 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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).
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 98b75f0..2b2d6a9 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -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\