From 5d076481f8b45fe8cf409bb95ff4558cf2cab06c Mon Sep 17 00:00:00 2001 From: Michael Poole Date: Mon, 8 Jan 2007 04:27:45 +0000 Subject: [PATCH] Avoid epoll_ctl(..., EPOLL_CTL_DEL, ...) for closed fds. src/ioset-impl.h (struct io_engine): Add "os_closed" parameter to remove() method. src/ioset.c (ioset_close): Add this to the call. src/ioset-epoll.c (ioset_epoll_remove): Use it to avoid removing the fd from epoll_fd, since that epoll_ctl() call will always fail. src/ioset-select.c (ioset_select_remove): Ignore the new parameter. git-archimport-id: srvx@srvx.net--2006/srvx--devo--1.3--patch-81 --- ChangeLog | 22 ++++++++++++++++++++++ src/ioset-epoll.c | 5 +++-- src/ioset-impl.h | 2 +- src/ioset-select.c | 3 ++- src/ioset.c | 2 +- 5 files changed, 29 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a066421..787425d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,28 @@ # arch-tag: automatic-ChangeLog--srvx@srvx.net--2006/srvx--devo--1.3 # +2007-01-08 04:27:45 GMT Michael Poole patch-81 + + Summary: + Avoid epoll_ctl(..., EPOLL_CTL_DEL, ...) for closed fds. + Revision: + srvx--devo--1.3--patch-81 + + src/ioset-impl.h (struct io_engine): Add "os_closed" parameter to + remove() method. + + src/ioset.c (ioset_close): Add this to the call. + + src/ioset-epoll.c (ioset_epoll_remove): Use it to avoid removing the fd + from epoll_fd, since that epoll_ctl() call will always fail. + + src/ioset-select.c (ioset_select_remove): Ignore the new parameter. + + modified files: + ChangeLog src/ioset-epoll.c src/ioset-impl.h + src/ioset-select.c src/ioset.c + + 2007-01-08 04:22:20 GMT Michael Poole patch-80 Summary: diff --git a/src/ioset-epoll.c b/src/ioset-epoll.c index a6b002e..40e30ba 100644 --- a/src/ioset-epoll.c +++ b/src/ioset-epoll.c @@ -65,10 +65,11 @@ ioset_epoll_add(struct io_fd *fd) } static void -ioset_epoll_remove(struct io_fd *fd) +ioset_epoll_remove(struct io_fd *fd, int closed) { static struct epoll_event evt; - (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt); + if (!closed) + (void)epoll_ctl(epoll_fd, EPOLL_CTL_DEL, fd->fd, &evt); } static void diff --git a/src/ioset-impl.h b/src/ioset-impl.h index a3c12ce..a7bebee 100644 --- a/src/ioset-impl.h +++ b/src/ioset-impl.h @@ -31,7 +31,7 @@ struct io_engine { const char *name; int (*init)(void); void (*add)(struct io_fd *fd); - void (*remove)(struct io_fd *fd); + void (*remove)(struct io_fd *fd, int os_closed); void (*update)(struct io_fd *fd); int (*loop)(struct timeval *timeout); void (*cleanup)(void); diff --git a/src/ioset-select.c b/src/ioset-select.c index 64afa0f..8ece128 100644 --- a/src/ioset-select.c +++ b/src/ioset-select.c @@ -57,10 +57,11 @@ ioset_select_add(struct io_fd *fd) } static void -ioset_select_remove(struct io_fd *fd) +ioset_select_remove(struct io_fd *fd, int closed) { FD_CLR(fd->fd, &read_fds); FD_CLR(fd->fd, &write_fds); + (void)closed; } static void diff --git a/src/ioset.c b/src/ioset.c index a199275..d237a3b 100644 --- a/src/ioset.c +++ b/src/ioset.c @@ -321,7 +321,7 @@ ioset_close(struct io_fd *fdp, int os_close) { free(fdp->recv.buf); if (os_close & 1) close(fdp->fd); - engine->remove(fdp); + engine->remove(fdp, os_close & 1); free(fdp); } -- 2.20.1