]> xenbits.xensource.com Git - xenclient/toolstack.git/commitdiff
fix tracking of maxfd in fdset
authorPrashanth Mundkur <prashanth.mundkur@citrix.com>
Thu, 14 May 2009 02:32:09 +0000 (19:32 -0700)
committerPrashanth Mundkur <prashanth.mundkur@citrix.com>
Thu, 14 May 2009 02:32:09 +0000 (19:32 -0700)
libs/stdext/unixext_stubs.c

index ca7573495ea8be6c0cf33d3e888f2aab8ffcb7f3..cbe15194ff13ddeffbcb5077973b95e48362f97a 100644 (file)
@@ -111,14 +111,32 @@ CAMLprim value stub_fdset_is_set(value set, value fd)
 CAMLprim value stub_fdset_set(value set, value fd)
 {
        CAMLparam2(set, fd);
-       FD_SET(Int_val(fd), FDSET_OF_VALUE(set));
+       int cfd;
+
+       cfd = Int_val(fd);
+       FD_SET(cfd, FDSET_OF_VALUE(set));
+       if (cfd > MAXFD_OF_VALUE(set))
+               MAXFD_OF_VALUE(set) = cfd;
        CAMLreturn(Val_unit);
 }
 
 CAMLprim value stub_fdset_clear(value set, value fd)
 {
        CAMLparam2(set, fd);
-       FD_CLR(Int_val(fd), FDSET_OF_VALUE(set));
+       int cfd, d;
+
+       cfd = Int_val(fd);
+       FD_CLR(cfd, FDSET_OF_VALUE(set));
+       if (cfd == MAXFD_OF_VALUE(set)) {
+               for (d = cfd - 1; d >= 0; d--) {
+                       if (FD_ISSET(d, FDSET_OF_VALUE(set))) {
+                               MAXFD_OF_VALUE(set) = d;
+                               break;
+                       }
+               }
+               if (d < 0)
+                       MAXFD_OF_VALUE(set) = -1;
+       }
        CAMLreturn(Val_unit);
 }
 
@@ -176,6 +194,9 @@ CAMLprim value stub_fdset_select(value rset, value wset, value eset, value t)
        memcpy(FDSET_OF_VALUE(nrset), &r, sizeof(fd_set));
        memcpy(FDSET_OF_VALUE(nwset), &w, sizeof(fd_set));
        memcpy(FDSET_OF_VALUE(neset), &e, sizeof(fd_set));
+       MAXFD_OF_VALUE(nrset) = MAXFD_OF_VALUE(rset);
+       MAXFD_OF_VALUE(nwset) = MAXFD_OF_VALUE(wset);
+       MAXFD_OF_VALUE(neset) = MAXFD_OF_VALUE(eset);
 
        ret = caml_alloc_small(3, 0);
        Field(ret, 0) = nrset;