]> granicus.if.org Git - libevent/commitdiff
Clean up error handling in epoll_apply_one_change() a little
authorNick Mathewson <nickm@torproject.org>
Thu, 16 Dec 2010 19:25:04 +0000 (14:25 -0500)
committerNick Mathewson <nickm@torproject.org>
Thu, 16 Dec 2010 19:34:14 +0000 (14:34 -0500)
The old code was more or less:
   if (op == X && errno == FOO) {
     ...
   } else if (op == Y && errno == BAR) {
     ...
   }
but really we wanted to do a switch (op) to avoid needless checks
and branches.

This patch leaves the indentation a little weird so as to make it
easier to see what changed; the next patch will fix the indentation.

epoll.c

diff --git a/epoll.c b/epoll.c
index 055a0c5a1cdd2f150368eb47e413794082cd229b..9e7ade0db300cd1c4a4f01f9b4f0f208c384c95f 100644 (file)
--- a/epoll.c
+++ b/epoll.c
@@ -356,8 +356,20 @@ epoll_apply_one_change(struct event_base *base,
                memset(&epev, 0, sizeof(epev));
                epev.data.fd = ch->fd;
                epev.events = events;
-               if (epoll_ctl(epollop->epfd, op, ch->fd, &epev) == -1) {
-                       if (op == EPOLL_CTL_MOD && errno == ENOENT) {
+               if (epoll_ctl(epollop->epfd, op, ch->fd, &epev) == 0) {
+                       event_debug(("Epoll %s(%d) on fd %d okay. [old events were %d; read change was %d; write change was %d]",
+                               epoll_op_to_string(op),
+                               (int)epev.events,
+                               (int)ch->fd,
+                               ch->old_events,
+                               ch->read_change,
+                               ch->write_change));
+                       return 0;
+               }
+
+               switch (op) {
+                       case EPOLL_CTL_MOD:
+                               if (errno == ENOENT) {
                                /* If a MOD operation fails with ENOENT, the
                                 * fd was probably closed and re-opened.  We
                                 * should retry the operation as an ADD.
@@ -370,8 +382,12 @@ epoll_apply_one_change(struct event_base *base,
                                        event_debug(("Epoll MOD(%d) on %d retried as ADD; succeeded.",
                                                (int)epev.events,
                                                ch->fd));
+                                       return 0;
+                               }
                                }
-                       } else if (op == EPOLL_CTL_ADD && errno == EEXIST) {
+                               break;
+                       case EPOLL_CTL_ADD:
+                               if (errno == EEXIST) {
                                /* If an ADD operation fails with EEXIST,
                                 * either the operation was redundant (as with a
                                 * precautionary add), or we ran into a fun
@@ -387,10 +403,13 @@ epoll_apply_one_change(struct event_base *base,
                                        event_debug(("Epoll ADD(%d) on %d retried as MOD; succeeded.",
                                                (int)epev.events,
                                                ch->fd));
+                                       return 0;
+                               }
                                }
-                       } else if (op == EPOLL_CTL_DEL &&
-                           (errno == ENOENT || errno == EBADF ||
-                               errno == EPERM)) {
+                               break;
+                       case EPOLL_CTL_DEL:
+                               if (errno == ENOENT || errno == EBADF ||
+                                   errno == EPERM) {
                                /* If a delete fails with one of these errors,
                                 * that's fine too: we closed the fd before we
                                 * got around to calling epoll_dispatch. */
@@ -398,7 +417,14 @@ epoll_apply_one_change(struct event_base *base,
                                        (int)epev.events,
                                        ch->fd,
                                        strerror(errno)));
-                       } else {
+                               return 0;
+                               }
+                               break;
+                       default:
+                               break;
+               }
+
+               if (1) {
                                event_warn("Epoll %s(%d) on fd %d failed.  Old events were %d; read change was %d (%s); write change was %d (%s)",
                                    epoll_op_to_string(op),
                                    (int)epev.events,
@@ -408,19 +434,9 @@ epoll_apply_one_change(struct event_base *base,
                                    change_to_string(ch->read_change),
                                    ch->write_change,
                                    change_to_string(ch->write_change));
-                               return -1;
                        }
-               } else {
-                       event_debug(("Epoll %s(%d) on fd %d okay. [old events were %d; read change was %d; write change was %d]",
-                               epoll_op_to_string(op),
-                               (int)epev.events,
-                               (int)ch->fd,
-                               ch->old_events,
-                               ch->read_change,
-                               ch->write_change));
-               }
+               return -1;
        }
-       return 0;
 }
 
 static int