]> git.llucax.com Git - software/libev.git/commitdiff
remember wether the fd was new or not
authorroot <root>
Wed, 12 Dec 2007 05:11:56 +0000 (05:11 +0000)
committerroot <root>
Wed, 12 Dec 2007 05:11:56 +0000 (05:11 +0000)
ev.c
ev.h

diff --git a/ev.c b/ev.c
index c9ff2f19f279c3265aa64a3c097f3e17b145f663..bd833e974ae02c545466a3795b97e118c253f055 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -559,16 +559,17 @@ fd_reify (EV_P)
 }
 
 void inline_size
-fd_change (EV_P_ int fd)
+fd_change (EV_P_ int fd, int flags)
 {
-  if (expect_false (anfds [fd].reify))
-    return;
-
-  anfds [fd].reify = 1;
+  unsigned char reify = anfds [fd].reify;
+  anfds [fd].reify |= flags | 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 +630,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);
       }
 }
 
@@ -1601,7 +1602,8 @@ ev_io_start (EV_P_ ev_io *w)
   array_needsize (ANFD, anfds, anfdmax, fd + 1, anfds_init);
   wlist_add (&anfds[fd].head, (WL)w);
 
-  fd_change (EV_A_ fd);
+  fd_change (EV_A_ fd, w->events & EV_IOFDSET);
+  w->events &= ~ EV_IOFDSET;
 }
 
 void noinline
@@ -1616,7 +1618,7 @@ ev_io_stop (EV_P_ ev_io *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, 0);
 }
 
 void noinline
diff --git a/ev.h b/ev.h
index c4b843e2e93d01146e389af8400550a869ea6950..635463c77e17a7a08e0523fbdfef656c4b227cc8 100644 (file)
--- a/ev.h
+++ b/ev.h
@@ -99,6 +99,7 @@ struct ev_loop;
 #define EV_NONE           0x00L /* no events */
 #define EV_READ           0x01L /* ev_io detected read will not block */
 #define EV_WRITE          0x02L /* ev_io detected write will not block */
+#define EV_IOFDSET        0x80L /* internal use only */
 #define EV_TIMEOUT  0x00000100L /* timer timed out */
 #define EV_PERIODIC 0x00000200L /* periodic timer timed out */
 #define EV_SIGNAL   0x00000400L /* signal was received */
@@ -432,7 +433,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent
   ev_set_cb ((ev), cb_);                       \
 } while (0)
 
-#define ev_io_set(ev,fd_,events_)           do { (ev)->fd = (fd_); (ev)->events = (events_); } while (0)
+#define ev_io_set(ev,fd_,events_)           do { (ev)->fd = (fd_); (ev)->events = (events_) | EV_IOFDSET; } while (0)
 #define ev_timer_set(ev,after_,repeat_)     do { (ev)->at = (after_); (ev)->repeat = (repeat_); } while (0)
 #define ev_periodic_set(ev,ofs_,ival_,res_) do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb= (res_); } while (0)
 #define ev_signal_set(ev,signum_)           do { (ev)->signum = (signum_); } while (0)