[master] 0bcfeee Move busyobj to their own source file, they are not really backend related and will have somewhat complex semantics.

Poul-Henning Kamp phk at varnish-cache.org
Thu Dec 8 07:17:54 CET 2011


commit 0bcfeee0ae14213f4277b199dadaaab481b7273f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Thu Dec 8 06:17:22 2011 +0000

    Move busyobj to their own source file, they are not really
    backend related and will have somewhat complex semantics.

diff --git a/bin/varnishd/Makefile.am b/bin/varnishd/Makefile.am
index 2116701..a4bae7f 100644
--- a/bin/varnishd/Makefile.am
+++ b/bin/varnishd/Makefile.am
@@ -16,6 +16,7 @@ varnishd_SOURCES = \
 	cache/cache_backend_cfg.c \
 	cache/cache_backend_poll.c \
 	cache/cache_ban.c \
+	cache/cache_busyobj.c \
 	cache/cache_center.c \
 	cache/cache_cli.c \
 	cache/cache_dir.c \
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 24c1dc9..0ee855b 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -673,12 +673,6 @@ void VDI_RecycleFd(struct worker *wrk, struct vbc **vbp);
 void VDI_AddHostHeader(struct worker *wrk, const struct vbc *vbc);
 void VBE_Poll(void);
 
-/* cache_backend.c */
-void VBE_Init(void);
-struct busyobj *VBE_GetBusyObj(struct worker *wrk);
-struct busyobj *VBE_RefBusyObj(struct busyobj *busyobj);
-void VBE_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
-
 /* cache_backend_cfg.c */
 void VBE_InitCfg(void);
 struct backend *VBE_AddBackend(struct cli *cli, const struct vrt_backend *vb);
@@ -703,6 +697,12 @@ struct ban *BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail);
 void BAN_TailDeref(struct ban **ban);
 double BAN_Time(const struct ban *ban);
 
+/* cache_busyobj.c */
+void VBO_Init(void);
+struct busyobj *VBO_GetBusyObj(struct worker *wrk);
+struct busyobj *VBO_RefBusyObj(struct busyobj *busyobj);
+void VBO_DerefBusyObj(struct worker *wrk, struct busyobj **busyobj);
+
 /* cache_center.c [CNT] */
 void CNT_Session(struct sess *sp);
 void CNT_Init(void);
diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index cf9d60f..4d2f18a 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -43,105 +43,6 @@
 #include "vrt.h"
 #include "vtcp.h"
 
-static struct lock nbusyobj_mtx;
-static struct busyobj *nbusyobj;
-
-void
-VBE_Init(void)
-{
-	Lck_New(&nbusyobj_mtx, lck_nbusyobj);
-	nbusyobj = NULL;
-}
-
-/*--------------------------------------------------------------------
- * BusyObj handling
- */
-
-static struct busyobj *
-vbe_NewBusyObj(void)
-{
-	struct busyobj *busyobj;
-
-	ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC);
-	AN(busyobj);
-	Lck_New(&busyobj->mtx, lck_busyobj);
-	return (busyobj);
-}
-
-static void
-vbe_FreeBusyObj(struct busyobj *busyobj)
-{
-	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
-	AZ(busyobj->refcount);
-	Lck_Delete(&busyobj->mtx);
-	FREE_OBJ(busyobj);
-}
-
-struct busyobj *
-VBE_GetBusyObj(struct worker *wrk)
-{
-	struct busyobj *busyobj = NULL;
-
-	(void)wrk;
-	Lck_Lock(&nbusyobj_mtx);
-	if (nbusyobj != NULL) {
-		CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC);
-		busyobj = nbusyobj;
-		nbusyobj = NULL;
-		memset((char *)busyobj + offsetof(struct busyobj, refcount), 0,
-		       sizeof *busyobj - offsetof(struct busyobj, refcount));
-	}
-	Lck_Unlock(&nbusyobj_mtx);
-	if (busyobj == NULL)
-		busyobj = vbe_NewBusyObj();
-	AN(busyobj);
-	busyobj->refcount = 1;
-	busyobj->beresp = wrk->x_beresp;
-	busyobj->bereq = wrk->x_bereq;
-	return (busyobj);
-}
-
-struct busyobj *
-VBE_RefBusyObj(struct busyobj *busyobj)
-{
-	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
-	Lck_Lock(&busyobj->mtx);
-	assert(busyobj->refcount > 0);
-	busyobj->refcount++;
-	Lck_Unlock(&busyobj->mtx);
-	return (busyobj);
-}
-
-void
-VBE_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
-{
-	struct busyobj *busyobj;
-
-	(void)wrk;
-	busyobj = *pbo;
-	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
-	Lck_Lock(&busyobj->mtx);
-	assert(busyobj->refcount > 0);
-	busyobj->refcount--;
-	*pbo = NULL;
-	if (busyobj->refcount > 0) {
-		Lck_Unlock(&busyobj->mtx);
-		return;
-	}
-	Lck_Unlock(&busyobj->mtx);
-
-	/* XXX Sanity checks e.g. AZ(busyobj->vbc) */
-
-	Lck_Lock(&nbusyobj_mtx);
-	if (nbusyobj == NULL) {
-		nbusyobj = busyobj;
-		busyobj = NULL;
-	}
-	Lck_Unlock(&nbusyobj_mtx);
-	if (busyobj != NULL)
-		vbe_FreeBusyObj(busyobj);
-}
-
 /*--------------------------------------------------------------------
  * The "simple" director really isn't, since thats where all the actual
  * connections happen.  Nontheless, pretend it is simple by sequestering
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
new file mode 100644
index 0000000..32bad7e
--- /dev/null
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -0,0 +1,138 @@
+/*-
+ * Copyright (c) 2006 Verdens Gang AS
+ * Copyright (c) 2006-2011 Varnish Software AS
+ * All rights reserved.
+ *
+ * Author: Poul-Henning Kamp <phk at phk.freebsd.dk>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Handle backend connections and backend request structures.
+ *
+ */
+
+#include "config.h"
+
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#include "cache.h"
+
+static struct lock nbusyobj_mtx;
+static struct busyobj *nbusyobj;
+
+void
+VBO_Init(void)
+{
+	Lck_New(&nbusyobj_mtx, lck_nbusyobj);
+	nbusyobj = NULL;
+}
+
+/*--------------------------------------------------------------------
+ * BusyObj handling
+ */
+
+static struct busyobj *
+vbo_NewBusyObj(void)
+{
+	struct busyobj *busyobj;
+
+	ALLOC_OBJ(busyobj, BUSYOBJ_MAGIC);
+	AN(busyobj);
+	Lck_New(&busyobj->mtx, lck_busyobj);
+	return (busyobj);
+}
+
+static void
+vbe_FreeBusyObj(struct busyobj *busyobj)
+{
+	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+	AZ(busyobj->refcount);
+	Lck_Delete(&busyobj->mtx);
+	FREE_OBJ(busyobj);
+}
+
+struct busyobj *
+VBO_GetBusyObj(struct worker *wrk)
+{
+	struct busyobj *busyobj = NULL;
+
+	(void)wrk;
+	Lck_Lock(&nbusyobj_mtx);
+	if (nbusyobj != NULL) {
+		CHECK_OBJ_NOTNULL(nbusyobj, BUSYOBJ_MAGIC);
+		busyobj = nbusyobj;
+		nbusyobj = NULL;
+		memset((char *)busyobj + offsetof(struct busyobj, refcount), 0,
+		       sizeof *busyobj - offsetof(struct busyobj, refcount));
+	}
+	Lck_Unlock(&nbusyobj_mtx);
+	if (busyobj == NULL)
+		busyobj = vbo_NewBusyObj();
+	AN(busyobj);
+	busyobj->refcount = 1;
+	busyobj->beresp = wrk->x_beresp;
+	busyobj->bereq = wrk->x_bereq;
+	return (busyobj);
+}
+
+struct busyobj *
+VBO_RefBusyObj(struct busyobj *busyobj)
+{
+	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+	Lck_Lock(&busyobj->mtx);
+	assert(busyobj->refcount > 0);
+	busyobj->refcount++;
+	Lck_Unlock(&busyobj->mtx);
+	return (busyobj);
+}
+
+void
+VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
+{
+	struct busyobj *busyobj;
+
+	(void)wrk;
+	busyobj = *pbo;
+	CHECK_OBJ_NOTNULL(busyobj, BUSYOBJ_MAGIC);
+	Lck_Lock(&busyobj->mtx);
+	assert(busyobj->refcount > 0);
+	busyobj->refcount--;
+	*pbo = NULL;
+	if (busyobj->refcount > 0) {
+		Lck_Unlock(&busyobj->mtx);
+		return;
+	}
+	Lck_Unlock(&busyobj->mtx);
+
+	/* XXX Sanity checks e.g. AZ(busyobj->vbc) */
+
+	Lck_Lock(&nbusyobj_mtx);
+	if (nbusyobj == NULL) {
+		nbusyobj = busyobj;
+		busyobj = NULL;
+	}
+	Lck_Unlock(&nbusyobj_mtx);
+	if (busyobj != NULL)
+		vbe_FreeBusyObj(busyobj);
+}
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index 442e2bb..8826ae2 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -255,7 +255,7 @@ cnt_prepresp(struct sess *sp)
 			AN(wrk->busyobj->do_stream);
 			VDI_CloseFd(wrk, &wrk->busyobj->vbc);
 			HSH_Drop(wrk);
-			VBE_DerefBusyObj(wrk, &wrk->busyobj);
+			VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		} else {
 			(void)HSH_Deref(wrk, NULL, &wrk->obj);
 		}
@@ -464,7 +464,7 @@ cnt_error(struct sess *sp)
 	if (wrk->obj == NULL) {
 		HSH_Prealloc(sp);
 		AZ(wrk->busyobj);
-		wrk->busyobj = VBE_GetBusyObj(wrk);
+		wrk->busyobj = VBO_GetBusyObj(wrk);
 		wrk->obj = STV_NewObject(wrk, NULL, cache_param->http_resp_size,
 		     (uint16_t)cache_param->http_max_hdr);
 		if (wrk->obj == NULL)
@@ -508,7 +508,7 @@ cnt_error(struct sess *sp)
 	if (sp->handling == VCL_RET_RESTART &&
 	    sp->restarts <  cache_param->max_restarts) {
 		HSH_Drop(wrk);
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		sp->director = NULL;
 		sp->restarts++;
 		sp->step = STP_RECV;
@@ -525,7 +525,7 @@ cnt_error(struct sess *sp)
 	sp->err_code = 0;
 	sp->err_reason = NULL;
 	http_Setup(wrk->busyobj->bereq, NULL);
-	VBE_DerefBusyObj(wrk, &wrk->busyobj);
+	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	sp->step = STP_PREPRESP;
 	return (0);
 }
@@ -654,7 +654,7 @@ cnt_fetch(struct sess *sp)
 		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
 		wrk->objcore = NULL;
 	}
-	VBE_DerefBusyObj(wrk, &wrk->busyobj);
+	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	sp->director = NULL;
 	wrk->storage_hint = NULL;
 
@@ -827,7 +827,7 @@ cnt_fetchbody(struct sess *sp)
 		sp->err_code = 503;
 		sp->step = STP_ERROR;
 		VDI_CloseFd(wrk, &wrk->busyobj->vbc);
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		return (0);
 	}
 	CHECK_OBJ_NOTNULL(wrk->obj, OBJECT_MAGIC);
@@ -896,7 +896,7 @@ cnt_fetchbody(struct sess *sp)
 
 	if (i) {
 		HSH_Drop(wrk);
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		AZ(wrk->obj);
 		sp->err_code = 503;
 		sp->step = STP_ERROR;
@@ -909,7 +909,7 @@ cnt_fetchbody(struct sess *sp)
 		AN(wrk->obj->objcore->ban);
 		HSH_Unbusy(wrk);
 	}
-	VBE_DerefBusyObj(wrk, &wrk->busyobj);
+	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	wrk->acct_tmp.fetch++;
 	sp->step = STP_PREPRESP;
 	return (0);
@@ -983,7 +983,7 @@ cnt_streambody(struct sess *sp)
 	assert(WRW_IsReleased(wrk));
 	assert(wrk->wrw.ciov == wrk->wrw.siov);
 	(void)HSH_Deref(wrk, NULL, &wrk->obj);
-	VBE_DerefBusyObj(wrk, &wrk->busyobj);
+	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	http_Setup(wrk->resp, NULL);
 	sp->step = STP_DONE;
 	return (0);
@@ -1253,7 +1253,7 @@ cnt_miss(struct sess *sp)
 	AN(wrk->objcore);
 	CHECK_OBJ_NOTNULL(wrk->busyobj, BUSYOBJ_MAGIC);
 	WS_Reset(wrk->ws, NULL);
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 	http_Setup(wrk->busyobj->bereq, wrk->ws);
 	http_FilterHeader(sp, HTTPH_R_FETCH);
 	http_ForceGet(wrk->busyobj->bereq);
@@ -1278,13 +1278,13 @@ cnt_miss(struct sess *sp)
 		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
 		wrk->objcore = NULL;
 		http_Setup(wrk->busyobj->bereq, NULL);
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		sp->step = STP_ERROR;
 		return (0);
 	case VCL_RET_PASS:
 		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
 		wrk->objcore = NULL;
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		sp->step = STP_PASS;
 		return (0);
 	case VCL_RET_FETCH:
@@ -1294,7 +1294,7 @@ cnt_miss(struct sess *sp)
 	case VCL_RET_RESTART:
 		AZ(HSH_Deref(wrk, wrk->objcore, NULL));
 		wrk->objcore = NULL;
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		INCOMPL();
 	default:
 		WRONG("Illegal action in vcl_miss{}");
@@ -1345,9 +1345,9 @@ cnt_pass(struct sess *sp)
 	AZ(wrk->obj);
 	AZ(wrk->busyobj);
 
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 	WS_Reset(wrk->ws, NULL);
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 	http_Setup(wrk->busyobj->bereq, wrk->ws);
 	http_FilterHeader(sp, HTTPH_R_PASS);
 
@@ -1357,7 +1357,7 @@ cnt_pass(struct sess *sp)
 	VCL_pass_method(sp);
 	if (sp->handling == VCL_RET_ERROR) {
 		http_Setup(wrk->busyobj->bereq, NULL);
-		VBE_DerefBusyObj(wrk, &wrk->busyobj);
+		VBO_DerefBusyObj(wrk, &wrk->busyobj);
 		sp->step = STP_ERROR;
 		return (0);
 	}
@@ -1405,9 +1405,9 @@ cnt_pipe(struct sess *sp)
 	AZ(wrk->busyobj);
 
 	wrk->acct_tmp.pipe++;
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 	WS_Reset(wrk->ws, NULL);
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 	http_Setup(wrk->busyobj->bereq, wrk->ws);
 	http_FilterHeader(sp, HTTPH_R_PIPE);
 
@@ -1420,7 +1420,7 @@ cnt_pipe(struct sess *sp)
 	PipeSession(sp);
 	assert(WRW_IsReleased(wrk));
 	http_Setup(wrk->busyobj->bereq, NULL);
-	VBE_DerefBusyObj(wrk, &wrk->busyobj);
+	VBO_DerefBusyObj(wrk, &wrk->busyobj);
 	sp->step = STP_DONE;
 	return (0);
 }
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index 8a73f6c..675afea 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -452,7 +452,7 @@ HSH_Lookup(struct sess *sp, struct objhead **poh)
 	oc->refcnt = 1;
 
 	AZ(wrk->busyobj);
-	wrk->busyobj = VBE_GetBusyObj(wrk);
+	wrk->busyobj = VBO_GetBusyObj(wrk);
 
 	VRY_Validate(sp->vary_b);
 	if (sp->vary_l != NULL)
diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c
index fbe7624..a10b0fe 100644
--- a/bin/varnishd/cache/cache_main.c
+++ b/bin/varnishd/cache/cache_main.c
@@ -117,7 +117,7 @@ child_main(void)
 
 	HTTP_Init();
 
-	VBE_Init();
+	VBO_Init();
 	VBE_InitCfg();
 	VBP_Init();
 	WRK_Init();



More information about the varnish-commit mailing list