Commit b00e099b authored by Dag Erling Smørgrav's avatar Dag Erling Smørgrav

r32845@cat (orig r1143): des | 2006-10-06 17:37:32 +0200

 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.


git-svn-id: http://www.varnish-cache.org/svn/branches/1.0@1182 d4fa192b-c00b-0410-8231-f00ffab90ce4
parents 6492e349 328daf3d
......@@ -62,10 +62,8 @@ vca_add(int fd, void *data)
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 @@ vca_main(void *arg)
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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment