]> granicus.if.org Git - python/commitdiff
select.select() now accepts a sequence (as defined by PySequence_Fast()) for
authorBrett Cannon <bcannon@gmail.com>
Wed, 10 Sep 2003 19:37:42 +0000 (19:37 +0000)
committerBrett Cannon <bcannon@gmail.com>
Wed, 10 Sep 2003 19:37:42 +0000 (19:37 +0000)
its first three arguments.

Closes RFE #798046 .

Doc/lib/libselect.tex
Misc/NEWS
Modules/selectmodule.c

index 803a05eaa9105e30cd09b96768eb1917878839dc..f3186c40030909f5716730ae7395036f7fe279d8 100644 (file)
@@ -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()}.%
index 1208d41a9282344266bd9d3483e29889b04b0578..5cf8d72e89c485557ad817d81241ddc2955f4fe7 100644 (file)
--- 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).
index 98b75f0672bfabc18312b6325978edaa326fe78c..2b2d6a90e805441701c9fec0976b345c3b65bccb 100644 (file)
@@ -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\