]> git.llucax.com Git - software/libev.git/commitdiff
- have to re-check potentially closed fds regularly for epoll. this hurts
authorroot <root>
Sun, 4 Nov 2007 23:14:11 +0000 (23:14 +0000)
committerroot <root>
Sun, 4 Nov 2007 23:14:11 +0000 (23:14 +0000)
  badly :(
- still more than twice as fats as libevent.
- many minor fixes

ev.c
ev.h
ev_epoll.c
ev_poll.c
ev_select.c
evdns.c
event.c

diff --git a/ev.c b/ev.c
index 5756bb73d7bce066330fd047a860700517b62e29..2db968e4716902a3ca978f8e2d3130272a53e116 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -308,11 +308,8 @@ fd_reify (EV_P)
 
       anfd->reify = 0;
 
 
       anfd->reify = 0;
 
-      if (anfd->events != events)
-        {
-          method_modify (EV_A_ fd, anfd->events, events);
-          anfd->events = events;
-        }
+      method_modify (EV_A_ fd, anfd->events, events);
+      anfd->events = events;
     }
 
   fdchangecnt = 0;
     }
 
   fdchangecnt = 0;
diff --git a/ev.h b/ev.h
index ecca8563915747440b091f2f9b5f040a17ed3e7f..1b33bf2bb41d89c697c9b3b1663dae5238898640 100644 (file)
--- a/ev.h
+++ b/ev.h
@@ -268,7 +268,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent
   ((struct ev_watcher *)(ev))->active   =      \
   ((struct ev_watcher *)(ev))->pending  =      \
   ((struct ev_watcher *)(ev))->priority = 0;   \
   ((struct ev_watcher *)(ev))->active   =      \
   ((struct ev_watcher *)(ev))->pending  =      \
   ((struct ev_watcher *)(ev))->priority = 0;   \
-  ((struct ev_watcher *)(ev))->cb = (cb_);     \
+  (ev)->cb = (cb_);                            \
 } while (0)
 
 #define ev_io_set(ev,fd_,events_)           do { (ev)->fd = (fd_); (ev)->events = (events_); } while (0)
 } while (0)
 
 #define ev_io_set(ev,fd_,events_)           do { (ev)->fd = (fd_); (ev)->events = (events_); } while (0)
@@ -293,7 +293,7 @@ void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revent
 #define ev_is_active(ev)                    (0 + ((struct ev_watcher *)(ev))->active) /* ro, true when the watcher has been started */
 
 #define ev_priority(ev)                     ((struct ev_watcher *)(ev))->priority /* rw */
 #define ev_is_active(ev)                    (0 + ((struct ev_watcher *)(ev))->active) /* ro, true when the watcher has been started */
 
 #define ev_priority(ev)                     ((struct ev_watcher *)(ev))->priority /* rw */
-#define ev_cb(ev)                           ((struct ev_watcher *)(ev))->cb       /* rw */
+#define ev_cb(ev)                           (ev)->cb /* rw */
 #define ev_set_priority(ev,pri)             ev_priority (ev) = (pri)
 #define ev_set_cb(ev,cb_)                   ev_cb (ev) = (cb_)
 
 #define ev_set_priority(ev,pri)             ev_priority (ev) = (pri)
 #define ev_set_cb(ev,cb_)                   ev_cb (ev) = (cb_)
 
index ffb1f05bbc07b3bc533b8e79ed7c11c3fb40c9d9..4689f8d3b3baf8ad09992f1b8ec1f9b88d8f39e8 100644 (file)
@@ -43,7 +43,9 @@ epoll_modify (EV_P_ int fd, int oev, int nev)
       | (nev & EV_WRITE ? EPOLLOUT : 0);
 
   if (epoll_ctl (epoll_fd, mode, fd, &ev))
       | (nev & EV_WRITE ? EPOLLOUT : 0);
 
   if (epoll_ctl (epoll_fd, mode, fd, &ev))
-    fd_kill (EV_A_ fd);
+    if (errno != ENOENT /* on ENOENT the fd went away, so try to do the right thing */
+        || (nev && epoll_ctl (epoll_fd, EPOLL_CTL_ADD, fd, &ev)))
+      fd_kill (EV_A_ fd);
 }
 
 static void
 }
 
 static void
index b858b45491ef48faa908e29b833280d518ffa666..b58ce8232a862c0d8219e8050be58e302bd50663 100644 (file)
--- a/ev_poll.c
+++ b/ev_poll.c
@@ -42,6 +42,10 @@ static void
 poll_modify (EV_P_ int fd, int oev, int nev)
 {
   int idx;
 poll_modify (EV_P_ int fd, int oev, int nev)
 {
   int idx;
+
+  if (oev == nev)
+    return;
+
   array_needsize (pollidxs, pollidxmax, fd + 1, pollidx_init);
 
   idx = pollidxs [fd];
   array_needsize (pollidxs, pollidxmax, fd + 1, pollidx_init);
 
   idx = pollidxs [fd];
index 327c31326c6e47ce746ee38477ed8b23eee4dd44..9f81e555799180dcca46f4274458be5976942b91 100644 (file)
@@ -48,6 +48,9 @@ select_modify (EV_P_ int fd, int oev, int nev)
   int offs = fd >> 3;
   int mask = 1 << (fd & 7);
 
   int offs = fd >> 3;
   int mask = 1 << (fd & 7);
 
+  if (oev == nev)
+    return;
+
   if (vec_max < (fd >> 5) + 1)
     {
       int new_max = (fd >> 5) + 1;
   if (vec_max < (fd >> 5) + 1)
     {
       int new_max = (fd >> 5) + 1;
diff --git a/evdns.c b/evdns.c
index e4e4e8f74f394dc1e18e7fddd13ab6aee7ac1dea..3fd2a91148bcc1cf4bb47f83ab20d43749388937 100644 (file)
--- a/evdns.c
+++ b/evdns.c
@@ -1,4 +1,4 @@
-/* $Id: evdns.c,v 1.11 2007-11-04 19:45:09 root Exp $ */
+/* $Id: evdns.c,v 1.12 2007-11-04 23:14:11 root Exp $ */
 
 /* The original version of this module was written by Adam Langley; for
  * a history of modifications, check out the subversion logs.
 
 /* The original version of this module was written by Adam Langley; for
  * a history of modifications, check out the subversion logs.
@@ -40,7 +40,7 @@
 #endif
 
 #ifdef WIN32
 #endif
 
 #ifdef WIN32
-#ifndef EV_EMBED
+#ifndef EV_STANDALONE
 #include "misc.h"
 #endif
 #endif
 #include "misc.h"
 #endif
 #endif
diff --git a/event.c b/event.c
index b34774cc3a11605fabbb1369f32bcbcce5439c9c..cf7739c0f64ff77dfb69e0f812a1c2de448c3fe4 100644 (file)
--- a/event.c
+++ b/event.c
@@ -91,7 +91,7 @@ void *event_init (void)
 #else
   assert (("multiple event bases not supported when not compiled with EV_MULTIPLICITY", !x_cur));
 
 #else
   assert (("multiple event bases not supported when not compiled with EV_MULTIPLICITY", !x_cur));
 
-  x_cur = (struct event_base *)ev_default_loop (EVMETHOD_AUTO);
+  x_cur = (struct event_base *)(long)ev_default_loop (EVMETHOD_AUTO);
 #endif
 
   return x_cur;
 #endif
 
   return x_cur;