summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2001-08-16 16:52:59 (GMT)
committerBarry Warsaw <barry@python.org>2001-08-16 16:52:59 (GMT)
commitb44740f741d73a7bb45df7040ff52cd10b52d5a4 (patch)
tree84a446162e7b8d3bae9e71001e295b13cf89fcb9
parentc019ecb7fe7b44fa339defd071510ec2b0728775 (diff)
downloadcpython-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.c29
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;
}