From 424b9cf4d40da771f4d7bf346c9b95a7f272c235 Mon Sep 17 00:00:00 2001
From: Xavier Leroy <xavier.leroy@inria.fr>
Date: Mon, 6 Jan 2003 16:44:21 +0000
Subject: Ajout {set,clear}_nonblock.  Cas special Unix.select lorsque les 3
 listes de descripteurs sont vides.  Correction bug traitement d'erreur dans
 Unix.accept.  PR#1499

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@5375 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
---
 otherlibs/win32unix/select.c | 51 +++++++++++++++++++++++++++-----------------
 1 file changed, 31 insertions(+), 20 deletions(-)

(limited to 'otherlibs/win32unix/select.c')

diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c
index 74aad826e..44930f7a7 100644
--- a/otherlibs/win32unix/select.c
+++ b/otherlibs/win32unix/select.c
@@ -57,27 +57,38 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value
 
   Begin_roots3 (readfds, writefds, exceptfds)
   Begin_roots3 (read_list, write_list, except_list)
-    fdlist_to_fdset(readfds, &read);
-    fdlist_to_fdset(writefds, &write);
-    fdlist_to_fdset(exceptfds, &except);
-    tm = Double_val(timeout);
-    if (tm < 0.0)
-      tvp = (struct timeval *) NULL;
-    else {
-      tv.tv_sec = (int) tm;
-      tv.tv_usec = (int) (1e6 * (tm - (int) tm));
-      tvp = &tv;
-    }
-    enter_blocking_section();
-    retcode = select(FD_SETSIZE, &read, &write, &except, tvp);
-    leave_blocking_section();
-    if (retcode == -1) {
-      win32_maperr(WSAGetLastError());
-      uerror("select", Nothing);
+    if (readfds == Val_int(0)
+	&& writefds == Val_int(0)
+	&& exceptfds == Val_int(0)) {
+      if ( tm > 0.0 ) {
+	enter_blocking_section();
+	Sleep( (int)(tm * 1000));
+	leave_blocking_section();
+      }
+      read_list = write_list = except_list = Val_int(0);
+    } else {      
+      fdlist_to_fdset(readfds, &read);
+      fdlist_to_fdset(writefds, &write);
+      fdlist_to_fdset(exceptfds, &except);
+      tm = Double_val(timeout);
+      if (tm < 0.0)
+	tvp = (struct timeval *) NULL;
+      else {
+	tv.tv_sec = (int) tm;
+	tv.tv_usec = (int) (1e6 * (tm - (int) tm));
+	tvp = &tv;
+      }
+      enter_blocking_section();
+      retcode = select(FD_SETSIZE, &read, &write, &except, tvp);
+      leave_blocking_section();
+      if (retcode == -1) {
+	win32_maperr(WSAGetLastError());
+	uerror("select", Nothing);
+      }
+      read_list = fdset_to_fdlist(readfds, &read);
+      write_list = fdset_to_fdlist(writefds, &write);
+      except_list = fdset_to_fdlist(exceptfds, &except);
     }
-    read_list = fdset_to_fdlist(readfds, &read);
-    write_list = fdset_to_fdlist(writefds, &write);
-    except_list = fdset_to_fdlist(exceptfds, &except);
     res = alloc_small(3, 0);
     Field(res, 0) = read_list;
     Field(res, 1) = write_list;
-- 
cgit v1.2.3-70-g09d2