diff options
author | Barry Warsaw <barry@python.org> | 2001-08-16 16:52:59 (GMT) |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2001-08-16 16:52:59 (GMT) |
commit | b44740f741d73a7bb45df7040ff52cd10b52d5a4 (patch) | |
tree | 84a446162e7b8d3bae9e71001e295b13cf89fcb9 | |
parent | c019ecb7fe7b44fa339defd071510ec2b0728775 (diff) | |
download | cpython-b44740f741d73a7bb45df7040ff52cd10b52d5a4.zip cpython-b44740f741d73a7bb45df7040ff52cd10b52d5a4.tar.gz cpython-b44740f741d73a7bb45df7040ff52cd10b52d5a4.tar.bz2 |
select_select(): Closing bug #448351 the easy way, i.e. by changing
the "#ifdef MS_WINDOWS" to "#ifdef SELECT_USES_HEAP" and by
setting SELECT_USES_HEAP when FD_SETSIZE > 1024.
The indirection seems useful since this subtly changes the path
that "normal" Windows programs take (where Timmie sez FD_SETSIZE =
512). If that's a problem for Windows, he has only one place to
change.
-rw-r--r-- | Modules/selectmodule.c | 29 |
1 files changed, 21 insertions, 8 deletions
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c index c92dc7f..285f6f0 100644 --- a/Modules/selectmodule.c +++ b/Modules/selectmodule.c @@ -181,18 +181,31 @@ set2list(fd_set *set, pylist fd2obj[FD_SETSIZE + 3]) return NULL; } - +#undef SELECT_USES_HEAP +#if FD_SETSIZE > 1024 +#define SELECT_USES_HEAP +#endif /* FD_SETSIZE > 1024 */ + static PyObject * select_select(PyObject *self, PyObject *args) { -#ifdef MS_WINDOWS +#ifdef SELECT_USES_HEAP /* This would be an awful lot of stack space on Windows! */ pylist *rfd2obj, *wfd2obj, *efd2obj; -#else +#else /* !SELECT_USES_HEAP */ + /* XXX: Why, oh why does this add 3?! As far as anyone can tell, + * it should only add 1 for the sentinel. + * + * XXX: All this should probably be implemented as follows: + * - find the highest descriptor we're interested in + * - add one + * - that's the size + * See: Stevens, APitUE, $12.5.1 + */ pylist rfd2obj[FD_SETSIZE + 3]; pylist wfd2obj[FD_SETSIZE + 3]; pylist efd2obj[FD_SETSIZE + 3]; -#endif +#endif /* SELECT_USES_HEAP */ PyObject *ifdlist, *ofdlist, *efdlist; PyObject *ret = NULL; PyObject *tout = Py_None; @@ -237,7 +250,7 @@ select_select(PyObject *self, PyObject *args) return NULL; } -#ifdef MS_WINDOWS +#ifdef SELECT_USES_HEAP /* Allocate memory for the lists */ rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 3); wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 3); @@ -248,7 +261,7 @@ select_select(PyObject *self, PyObject *args) if (efd2obj) PyMem_DEL(efd2obj); return NULL; } -#endif +#endif /* SELECT_USES_HEAP */ /* Convert lists to fd_sets, and get maximum fd number * propagates the Python exception set in list2set() */ @@ -302,11 +315,11 @@ select_select(PyObject *self, PyObject *args) reap_obj(rfd2obj); reap_obj(wfd2obj); reap_obj(efd2obj); -#ifdef MS_WINDOWS +#ifdef SELECT_USES_HEAP PyMem_DEL(rfd2obj); PyMem_DEL(wfd2obj); PyMem_DEL(efd2obj); -#endif +#endif /* SELECT_USES_HEAP */ return ret; } |