]> git.llucax.com Git - software/libev.git/blobdiff - ev_select.c
optimise ev_now when \!MULTIPLICITY
[software/libev.git] / ev_select.c
index d9fdf924682b0453d86d9745305d5a80441107c1..7fe9084c4b34a4d2792854434fe8818559d6a7a5 100644 (file)
  */
 
 /* for unix systems */
-#ifdef WIN32
+#if WIN32
 typedef unsigned int uint32_t;
-# define EV_SELECT_USE_FD_SET 1
+# ifndef EV_SELECT_USE_FD_SET
+#  define EV_SELECT_USE_FD_SET 1
+# endif
 #else
 # include <sys/select.h>
 # include <inttypes.h>
 #endif
 
+#if EV_SELECT_USE_WIN32_HANDLES
+# undef EV_SELECT_USE_FD_SET
+# define EV_SELECT_USE_FD_SET 1
+#endif
+
 #include <string.h>
 
 static void
@@ -47,6 +54,12 @@ select_modify (EV_P_ int fd, int oev, int nev)
     return;
 
 #if EV_SELECT_USE_FD_SET
+# if EV_SELECT_USE_WIN32_HANDLES
+  fd = _get_osfhandle (fd);
+  if (fd < 0)
+    return;
+# endif
+
   if (nev & EV_READ)
     FD_SET (fd, (struct fd_set *)vec_ri);
   else
@@ -124,6 +137,26 @@ select_poll (EV_P_ ev_tstamp timeout)
     }
 
 #if EV_SELECT_USE_FD_SET
+# if EV_SELECT_USE_WIN32_HANDLES
+  for (word = 0; word < anfdmax; ++word)
+    {
+      if (!anfd [word].events)
+        {
+          int fd = _get_osfhandle (word);
+
+          if (fd >= 0)
+            {
+              int events = 0;
+
+              if (FD_ISSET (fd, (struct fd_set *)vec_ro)) events |= EV_READ;
+              if (FD_ISSET (fd, (struct fd_set *)vec_wo)) events |= EV_WRITE;
+
+              if (events)
+                fd_event (EV_A_ word, events);
+            }
+        }
+    }
+# else
   for (word = 0; word < FD_SETSIZE; ++word)
     {
       int events = 0;
@@ -133,6 +166,7 @@ select_poll (EV_P_ ev_tstamp timeout)
       if (events)
         fd_event (EV_A_ word, events);
     }
+# endif
 #else
   for (word = vec_max; word--; )
     {