From 62be9a320fcf121413848389b0b5b986c3942588 Mon Sep 17 00:00:00 2001 From: Prashanth Mundkur Date: Wed, 13 May 2009 19:32:09 -0700 Subject: [PATCH] fix tracking of maxfd in fdset --- libs/stdext/unixext_stubs.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/libs/stdext/unixext_stubs.c b/libs/stdext/unixext_stubs.c index ca75734..cbe1519 100644 --- a/libs/stdext/unixext_stubs.c +++ b/libs/stdext/unixext_stubs.c @@ -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; -- 2.39.5