]> err.no Git - varnish/commitdiff
Go over pipe's polling code and try to do it right in one go by
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 1 Oct 2007 12:44:19 +0000 (12:44 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 1 Oct 2007 12:44:19 +0000 (12:44 +0000)
actually paying attention to what goes on.

git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@2077 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache_pipe.c

index 4df0a0c2c583eeec85ed3c94c856ac4c8b4139c8..5e36d172fb2a49ee529df887f9c6d2c4e823210a 100644 (file)
 #include "cache.h"
 
 static void
-rdf(struct pollfd *fds, int idx)
+rdf(struct pollfd *fds, int idx, int fd0, int fd1)
 {
        int i, j;
        char buf[BUFSIZ], *p;
 
        i = read(fds[idx].fd, buf, sizeof buf);
        if (i <= 0 || fds[1-idx].events == 0) {
-               AZ(shutdown(fds[idx].fd, SHUT_RD));
-               AZ(shutdown(fds[1-idx].fd, SHUT_WR));
+               AZ(shutdown(fd0, SHUT_RD));
+               AZ(shutdown(fd1, SHUT_WR));
                fds[idx].fd = -1;
                fds[idx].events = 0;
                return;
@@ -59,10 +59,10 @@ rdf(struct pollfd *fds, int idx)
        for (p = buf; i > 0; i -= j, p += j) {
                j = write(fds[1-idx].fd, p, i);
                if (j != i) {
-                       AZ(shutdown(fds[idx].fd, SHUT_WR));
-                       AZ(shutdown(fds[1-idx].fd, SHUT_RD));
-                       fds[1-idx].fd = -1;
-                       fds[1-idx].events = 0;
+                       AZ(shutdown(fd0, SHUT_RD));
+                       AZ(shutdown(fd1, SHUT_WR));
+                       fds[idx].fd = -1;
+                       fds[idx].events = 0;
                        return;
                }
        }
@@ -114,12 +114,20 @@ PipeSession(struct sess *sp)
                fds[0].revents = 0;
                fds[1].revents = 0;
                i = poll(fds, 2, params->pipe_timeout * 1000);
-               if (i != 1)
+               if (i < 1) 
                        break;
                if (fds[0].revents)
-                       rdf(fds, 0);
+                       rdf(fds, 0, vc->fd, sp->fd);
                if (fds[1].revents)
-                       rdf(fds, 1);
+                       rdf(fds, 1, sp->fd, vc->fd);
+       }
+       if (fds[0].fd >= 0) {
+               AZ(shutdown(fds[0].fd, SHUT_RD));
+               AZ(shutdown(fds[1].fd, SHUT_WR));
+       }
+       if (fds[1].fd >= 0) {
+               AZ(shutdown(fds[1].fd, SHUT_RD));
+               AZ(shutdown(fds[0].fd, SHUT_WR));
        }
        vca_close_session(sp, "pipe");
        VBE_ClosedFd(sp->wrk, vc);