]> granicus.if.org Git - python/commitdiff
On Windows, put the select file descriptor arrays on the heap.
authorGuido van Rossum <guido@python.org>
Thu, 2 Jul 1998 02:53:36 +0000 (02:53 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 2 Jul 1998 02:53:36 +0000 (02:53 +0000)
This is because they are huge and the stack is limited on Windows.
Other platforms keep declaring it on the stack.

Modules/selectmodule.c

index dc3b521e96a6885ae28fa65085fccf8c6d64b310..391318199c005e7ca974e8521a0d569e2f50db8c 100644 (file)
@@ -215,9 +215,14 @@ select_select(self, args)
        PyObject *self;
        PyObject *args;
 {
+#ifdef MS_WINDOWS
+       /* This would be an awful lot of stack space on Windows! */
+       pylist *rfd2obj, *wfd2obj, *efd2obj;
+#else
        pylist rfd2obj[FD_SETSIZE + 3];
        pylist wfd2obj[FD_SETSIZE + 3];
        pylist efd2obj[FD_SETSIZE + 3];
+#endif
        PyObject *ifdlist, *ofdlist, *efdlist;
        PyObject *ret = NULL;
        PyObject *tout = Py_None;
@@ -258,6 +263,18 @@ select_select(self, args)
                return NULL;
        }
 
+#ifdef MS_WINDOWS
+       /* Allocate memory for the lists */
+       rfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 3);
+       wfd2obj = PyMem_NEW(pylist, FD_SETSIZE + 3);
+       efd2obj = PyMem_NEW(pylist, FD_SETSIZE + 3);
+       if (rfd2obj == NULL || wfd2obj == NULL || efd2obj == NULL) {
+               PyMem_XDEL(rfd2obj);
+               PyMem_XDEL(wfd2obj);
+               PyMem_XDEL(efd2obj);
+               return NULL;
+       }
+#endif
        /* Convert lists to fd_sets, and get maximum fd number
         * propagates the Python exception set in list2set()
         */
@@ -311,6 +328,11 @@ select_select(self, args)
        reap_obj(rfd2obj);
        reap_obj(wfd2obj);
        reap_obj(efd2obj);
+#ifdef MS_WINDOWS
+       PyMem_DEL(rfd2obj);
+       PyMem_DEL(wfd2obj);
+       PyMem_DEL(efd2obj);
+#endif
        return ret;
 }