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);
}
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;