]> err.no Git - varnish/commitdiff
Make a central TCP_close() function that accepts the two errno's which
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Tue, 12 Aug 2008 12:28:38 +0000 (12:28 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Tue, 12 Aug 2008 12:28:38 +0000 (12:28 +0000)
indicate that our partner gave up on us.

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

varnish-cache/bin/varnishd/cache_backend.c
varnish-cache/bin/varnishd/common.h
varnish-cache/bin/varnishd/tcp.c

index 098d9e111904a5eabfb0dfad80b6c30f843bc3c1..c994607d5bcb5d5a62968d86ecc3e5737b7af47a 100644 (file)
@@ -242,7 +242,7 @@ bes_conn_try(const struct sess *sp, struct backend *bp)
 
        LOCK(&bp->mtx);
        bp->refcount++;
-       UNLOCK(&sp->backend->mtx);
+       UNLOCK(&bp->mtx);
 
        s = -1;
        assert(bp->ipv6 != NULL || bp->ipv4 != NULL);
@@ -257,7 +257,7 @@ bes_conn_try(const struct sess *sp, struct backend *bp)
                s = VBE_TryConnect(sp, PF_INET6, bp->ipv6, bp->ipv6len);
 
        if (s < 0) {
-               LOCK(&sp->backend->mtx);
+               LOCK(&bp->mtx);
                bp->refcount--;         /* Only keep ref on success */
                UNLOCK(&bp->mtx);
        }
@@ -317,16 +317,13 @@ void
 VBE_ClosedFd(struct worker *w, struct vbe_conn *vc)
 {
        struct backend *b;
-       int i;
 
        CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC);
        CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC);
        b = vc->backend;
        assert(vc->fd >= 0);
        WSL(w, SLT_BackendClose, vc->fd, "%s", vc->backend->vcl_name);
-       i = close(vc->fd);
-       assert(i == 0 || errno == ECONNRESET || errno == ENOTCONN);
-       vc->fd = -1;
+       TCP_close(&vc->fd);
        VBE_DropRef(vc->backend);
        vc->backend = NULL;
        VBE_ReleaseConn(vc);
index 849660e6c9163ee7cb28059b8f597e0afbe857b6..280486a416ffa92e65e09a074dd7a0ce5087baf3 100644 (file)
@@ -54,6 +54,7 @@ void TCP_blocking(int sock);
 void TCP_nonblocking(int sock);
 #ifdef SOL_SOCKET
 int TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec);
+void TCP_close(int *s);
 #endif
 
 #define TRUST_ME(ptr)  ((void*)(uintptr_t)(ptr))
index 5e8be682648577bcad3656366ec4cc34013774d0..ad95b7bd5c9cac2baaccf4e98b3be40584750eb3 100644 (file)
@@ -192,3 +192,17 @@ TCP_connect(int s, const struct sockaddr *name, socklen_t namelen, int msec)
        TCP_blocking(s);
        return (0);
 }
+
+/*--------------------------------------------------------------------
+ * When closing a TCP connection, a couple of errno's are legit, we
+ * can't be held responsible for the other end wanting to talk to us.
+ */
+
+void
+TCP_close(int *s)
+{
+       assert (close(*s) == 0 ||
+           errno == ECONNRESET ||
+           errno == ENOTCONN);
+       *s = -1;
+}