diff options
author | Guido van Rossum <guido@python.org> | 1996-06-12 04:22:53 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1996-06-12 04:22:53 (GMT) |
commit | 4f0fbf884b50399423a494a682063d13e1a51391 (patch) | |
tree | 0e4fcd4ce8cf0c292c33106e412714b0c47ae449 /Modules/selectmodule.c | |
parent | c34c9a50016f31db443a9afdf717f48eca9d34d9 (diff) | |
download | cpython-4f0fbf884b50399423a494a682063d13e1a51391.zip cpython-4f0fbf884b50399423a494a682063d13e1a51391.tar.gz cpython-4f0fbf884b50399423a494a682063d13e1a51391.tar.bz2 |
Yet another pass at fd2obj -- this time for Windows
Diffstat (limited to 'Modules/selectmodule.c')
-rw-r--r-- | Modules/selectmodule.c | 87 |
1 files changed, 58 insertions, 29 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index 5c83588..85a2557 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -22,29 +22,44 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ -/* select - Module containing unix select(2) call */ +/* select - Module containing unix select(2) call. +Under Unix, the file descriptors are small integers. +Under Win32, select only exists for sockets, and sockets may +have any value except INVALID_SOCKET. +*/ #include "allobjects.h" #include "modsupport.h" #include "ceval.h" #include <sys/types.h> + +#ifdef _MSC_VER +#include <winsock.h> +#else #include "myselect.h" /* Also includes mytime.h */ +#define SOCKET int +#endif static object *SelectError; -static +typedef struct { /* list of Python objects and their file descriptor */ + object *obj; + SOCKET fd; +} pylist; + +static int list2set(list, set, fd2obj) object *list; fd_set *set; - object *fd2obj[FD_SETSIZE]; + pylist fd2obj[FD_SETSIZE + 3]; { - int i, len, v, max = -1; + int i, len, index, max = -1; object *o, *filenomethod, *fno; + SOCKET v; - for ( i=0; i<FD_SETSIZE; i++ ) { - fd2obj[i] = (object*)0; - } + index = 0; + fd2obj[0].obj = (object*)0; /* set list to zero size */ FD_ZERO(set); len = getlistsize(list); @@ -68,47 +83,57 @@ list2set(list, set, fd2obj) err_badarg(); return -1; } +#ifdef _MSC_VER + max = 0; /* not used for Win32 */ +#else if ( v < 0 || v >= FD_SETSIZE ) { err_setstr(ValueError, "filedescriptor out of range in select()"); return -1; } if ( v > max ) max = v; +#endif FD_SET(v, set); - fd2obj[v] = o; + /* add object and its file descriptor to the list */ + if ( index >= FD_SETSIZE ) { + err_setstr(ValueError, "too many file descriptors in select()"); + return -1; + } + fd2obj[index].obj = o; + fd2obj[index].fd = v; + fd2obj[++index].obj = (object *)0; /* sentinel */ } return max+1; } static object * -set2list(set, max, fd2obj) +set2list(set, fd2obj) fd_set *set; - int max; - object *fd2obj[FD_SETSIZE]; + pylist fd2obj[FD_SETSIZE + 3]; { - int i, num=0; + int j, num=0; object *list, *o; + SOCKET fd; - for(i=0; i<max; i++) - if ( FD_ISSET(i,set) ) + for(j=0; fd2obj[j].obj; j++) + if ( FD_ISSET(fd2obj[j].fd, set) ) num++; list = newlistobject(num); num = 0; - for(i=0; i<max; i++) - if ( FD_ISSET(i,set) ) { - if ( i > FD_SETSIZE ) { + for(j=0; fd2obj[j].obj; j++) { + fd = fd2obj[j].fd; + if ( FD_ISSET(fd, set) ) { +#ifndef _MSC_VER + if ( fd > FD_SETSIZE ) { err_setstr(SystemError, "filedescriptor out of range returned in select()"); return NULL; } - o = fd2obj[i]; - if ( o == NULL ) { - err_setstr(SystemError, - "Bad filedescriptor returned from select()"); - return NULL; - } +#endif + o = fd2obj[j].obj; INCREF(o); setlistitem(list, num, o); num++; + } } return list; } @@ -118,7 +143,7 @@ select_select(self, args) object *self; object *args; { - object *rfd2obj[FD_SETSIZE], *wfd2obj[FD_SETSIZE], *efd2obj[FD_SETSIZE]; + pylist rfd2obj[FD_SETSIZE + 3], wfd2obj[FD_SETSIZE + 3], efd2obj[FD_SETSIZE + 3]; object *ifdlist, *ofdlist, *efdlist; object *ret, *tout; fd_set ifdset, ofdset, efdset; @@ -175,12 +200,16 @@ select_select(self, args) return 0; } - if ( n == 0 ) - imax = omax = emax = 0; /* Speedup hack */ + if ( n == 0 ) { /* Speedup hack */ + ifdlist = newlistobject(0); + ret = mkvalue("OOO", ifdlist, ifdlist, ifdlist); + XDECREF(ifdlist); + return ret; + } - ifdlist = set2list(&ifdset, imax, rfd2obj); - ofdlist = set2list(&ofdset, omax, wfd2obj); - efdlist = set2list(&efdset, emax, efd2obj); + ifdlist = set2list(&ifdset, rfd2obj); + ofdlist = set2list(&ofdset, wfd2obj); + efdlist = set2list(&efdset, efd2obj); ret = mkvalue("OOO", ifdlist, ofdlist, efdlist); XDECREF(ifdlist); XDECREF(ofdlist); |