]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
*** empty log message ***
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index e87da22585746f6470433433d27988503ee77760..1d0a5bf4b793fb5196a2363e01aa9d71b421fbd5 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -535,10 +535,10 @@ fd_reify (EV_P)
       ANFD *anfd = anfds + fd;
       ev_io *w;
 
-      int events = 0;
+      unsigned char events = 0;
 
       for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)
-        events |= w->events;
+        events |= (unsigned char)w->events;
 
 #if EV_SELECT_IS_WINSOCKET
       if (events)
@@ -549,26 +549,33 @@ fd_reify (EV_P)
         }
 #endif
 
-      anfd->reify = 0;
+      {
+        unsigned char o_events = anfd->events;
+        unsigned char o_reify  = anfd->reify;
+
+        anfd->reify  = 0;
+        anfd->events = events;
 
-      backend_modify (EV_A_ fd, anfd->events, events);
-      anfd->events = events;
+        if (o_events != events || o_reify & EV_IOFDSET)
+          backend_modify (EV_A_ fd, o_events, events);
+      }
     }
 
   fdchangecnt = 0;
 }
 
 void inline_size
-fd_change (EV_P_ int fd)
+fd_change (EV_P_ int fd, int flags)
 {
-  if (expect_false (anfds [fd].reify))
-    return;
+  unsigned char reify = anfds [fd].reify;
+  anfds [fd].reify |= flags;
 
-  anfds [fd].reify = 1;
-
-  ++fdchangecnt;
-  array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2);
-  fdchanges [fdchangecnt - 1] = fd;
+  if (expect_true (!reify))
+    {
+      ++fdchangecnt;
+      array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2);
+      fdchanges [fdchangecnt - 1] = fd;
+    }
 }
 
 void inline_speed
@@ -629,7 +636,7 @@ fd_rearm_all (EV_P)
     if (anfds [fd].events)
       {
         anfds [fd].events = 0;
-        fd_change (EV_A_ fd);
+        fd_change (EV_A_ fd, EV_IOFDSET | 1);
       }
 }
 
@@ -794,7 +801,7 @@ siginit (EV_P)
 
 /*****************************************************************************/
 
-static ev_child *childs [EV_PID_HASHSIZE];
+static WL childs [EV_PID_HASHSIZE];
 
 #ifndef _WIN32
 
@@ -1599,9 +1606,10 @@ ev_io_start (EV_P_ ev_io *w)
 
   ev_start (EV_A_ (W)w, 1);
   array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init);
-  wlist_add ((WL *)&anfds[fd].head, (WL)w);
+  wlist_add (&anfds[fd].head, (WL)w);
 
-  fd_change (EV_A_ fd);
+  fd_change (EV_A_ fd, w->events & EV_IOFDSET | 1);
+  w->events &= ~EV_IOFDSET;
 }
 
 void noinline
@@ -1613,10 +1621,10 @@ ev_io_stop (EV_P_ ev_io *w)
 
   assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax));
 
-  wlist_del ((WL *)&anfds[w->fd].head, (WL)w);
+  wlist_del (&anfds[w->fd].head, (WL)w);
   ev_stop (EV_A_ (W)w);
 
-  fd_change (EV_A_ w->fd);
+  fd_change (EV_A_ w->fd, 1);
 }
 
 void noinline
@@ -1768,7 +1776,7 @@ ev_signal_start (EV_P_ ev_signal *w)
   }
 
   ev_start (EV_A_ (W)w, 1);
-  wlist_add ((WL *)&signals [w->signum - 1].head, (WL)w);
+  wlist_add (&signals [w->signum - 1].head, (WL)w);
 
   if (!((WL)w)->next)
     {
@@ -1791,7 +1799,7 @@ ev_signal_stop (EV_P_ ev_signal *w)
   if (expect_false (!ev_is_active (w)))
     return;
 
-  wlist_del ((WL *)&signals [w->signum - 1].head, (WL)w);
+  wlist_del (&signals [w->signum - 1].head, (WL)w);
   ev_stop (EV_A_ (W)w);
 
   if (!signals [w->signum - 1].head)
@@ -1808,7 +1816,7 @@ ev_child_start (EV_P_ ev_child *w)
     return;
 
   ev_start (EV_A_ (W)w, 1);
-  wlist_add ((WL *)&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
+  wlist_add (&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
 }
 
 void
@@ -1818,7 +1826,7 @@ ev_child_stop (EV_P_ ev_child *w)
   if (expect_false (!ev_is_active (w)))
     return;
 
-  wlist_del ((WL *)&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
+  wlist_del (&childs [w->pid & (EV_PID_HASHSIZE - 1)], (WL)w);
   ev_stop (EV_A_ (W)w);
 }