Skip to content

Commit

Permalink
Clean up error handling in epoll_apply_one_change() a little
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nmathewson committed Dec 16, 2010
1 parent 8c83eb6 commit 2d55a19
Showing 1 changed file with 34 additions and 18 deletions.
52 changes: 34 additions & 18 deletions epoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand All @@ -387,18 +403,28 @@ 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. */
event_debug(("Epoll DEL(%d) on fd %d gave %s: DEL was unnecessary.",
(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,
Expand All @@ -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
Expand Down

0 comments on commit 2d55a19

Please sign in to comment.