r1143 - trunk/varnish-cache/bin/varnishd
des at projects.linpro.no
des at projects.linpro.no
Fri Oct 6 17:37:32 CEST 2006
Author: des
Date: 2006-10-06 17:37:32 +0200 (Fri, 06 Oct 2006)
New Revision: 1143
Modified:
trunk/varnish-cache/bin/varnishd/cache_acceptor_epoll.c
Log:
On Linux 2.6.8 and older, epoll_ctl(EPOLL_CTL_DEL) requires a poll_event
even though it is not used, and will return EFAULT if one is not provided.
Also, instead of silently accepting EBADF from epoll_ctl(), check that
sp->fd != -1 before calling vca_del(). This can happen in some cases
where vca_pollsession() closes the session before returning. This way,
we will still get an assertion failure if epoll_ctl() fails for some
other (unexpected) reason.
Thanks to airmax for his assistance in tracking this down.
Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor_epoll.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_acceptor_epoll.c 2006-10-06 12:58:04 UTC (rev 1142)
+++ trunk/varnish-cache/bin/varnishd/cache_acceptor_epoll.c 2006-10-06 15:37:32 UTC (rev 1143)
@@ -62,10 +62,8 @@
static void
vca_del(int fd)
{
- int i;
-
- i = epoll_ctl(epfd, EPOLL_CTL_DEL, fd, NULL);
- assert(i == 0 || errno == EBADF);
+ struct epoll_event ev = { 0, { 0 } };
+ AZ(epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &ev));
}
static void
@@ -103,7 +101,8 @@
i = vca_pollsession(sp);
if (i >= 0) {
TAILQ_REMOVE(&sesshead, sp, list);
- vca_del(sp->fd);
+ if (sp->fd != -1)
+ vca_del(sp->fd);
if (i == 0)
vca_handover(sp, i);
else
More information about the varnish-commit
mailing list