]> err.no Git - varnish/commitdiff
On Linux 2.6.8 and older, epoll_ctl(EPOLL_CTL_DEL) requires a poll_event
authordes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 6 Oct 2006 15:37:32 +0000 (15:37 +0000)
committerdes <des@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Fri, 6 Oct 2006 15:37:32 +0000 (15:37 +0000)
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: svn+ssh://projects.linpro.no/svn/varnish/trunk@1143 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache_acceptor_epoll.c

index 3f795ca786b8d2a26c78be31e2f5790d3e30cd9d..6a29422de30590c182daf847598f58051d179a07 100644 (file)
@@ -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