[PATCH 2/3] Add a function to register expiry callbacks in vmod_debug

Martin Blix Grydeland martin at varnish-software.com
Thu Feb 26 12:00:23 CET 2015


---
 lib/libvmod_debug/vmod.vcc     |  4 ++++
 lib/libvmod_debug/vmod_debug.c | 47 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/lib/libvmod_debug/vmod.vcc b/lib/libvmod_debug/vmod.vcc
index b5d108c..8e940f4 100644
--- a/lib/libvmod_debug/vmod.vcc
+++ b/lib/libvmod_debug/vmod.vcc
@@ -93,3 +93,7 @@ Encrypt the HTTP header with quad-ROT13 encryption,
 $Function STRING argtest(STRING one, REAL two=2, STRING three="3")
 
 $Function INT vre_limit()
+
+$Function VOID register_exp_callback(PRIV_VCL)
+
+Register the vmod to receive expiry callbacks
diff --git a/lib/libvmod_debug/vmod_debug.c b/lib/libvmod_debug/vmod_debug.c
index 72bbbe4..7d21c16 100644
--- a/lib/libvmod_debug/vmod_debug.c
+++ b/lib/libvmod_debug/vmod_debug.c
@@ -40,6 +40,7 @@ struct priv_vcl {
 	unsigned		magic;
 #define PRIV_VCL_MAGIC		0x8E62FA9D
 	char			*foo;
+	struct exp_callback	*exp_cb;
 };
 
 VCL_VOID __match_proto__(td_debug_panic)
@@ -176,6 +177,45 @@ vmod_vre_limit(VRT_CTX)
 	return (cache_param->vre_limits.match);
 }
 
+static void __match_proto__(exp_callback_f)
+exp_cb_insert(struct worker *wrk, struct objcore *oc, void *priv)
+{
+	const struct priv_vcl *priv_vcl;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	CAST_OBJ_NOTNULL(priv_vcl, priv, PRIV_VCL_MAGIC);
+	VSL(SLT_Debug, 0, "exp_cb: insert %p", oc);
+}
+
+static void __match_proto__(exp_callback_f)
+exp_cb_remove(struct worker *wrk, struct objcore *oc, void *priv)
+{
+	const struct priv_vcl *priv_vcl;
+
+	CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+	CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+	CAST_OBJ_NOTNULL(priv_vcl, priv, PRIV_VCL_MAGIC);
+	VSL(SLT_Debug, 0, "exp_cb: remove %p", oc);
+}
+
+VCL_VOID
+vmod_register_exp_callback(VRT_CTX, struct vmod_priv *priv)
+{
+	struct priv_vcl *priv_vcl;
+
+	CHECK_OBJ_NOTNULL(ctx, VRT_CTX_MAGIC);
+	CAST_OBJ_NOTNULL(priv_vcl, priv->priv, PRIV_VCL_MAGIC);
+	AZ(priv_vcl->exp_cb);
+	ALLOC_OBJ(priv_vcl->exp_cb, EXP_CALLBACK_MAGIC);
+	AN(priv_vcl->exp_cb);
+	priv_vcl->exp_cb->cb_insert = exp_cb_insert;
+	priv_vcl->exp_cb->cb_remove = exp_cb_remove;
+	priv_vcl->exp_cb->priv = priv_vcl;
+	EXP_Reg_Callback(priv_vcl->exp_cb);
+	VSL(SLT_Debug, 0, "exp_cb: registered");
+}
+
 static void __match_proto__(vmod_priv_free_f)
 priv_vcl_free(void *priv)
 {
@@ -184,6 +224,13 @@ priv_vcl_free(void *priv)
 	CAST_OBJ_NOTNULL(priv_vcl, priv, PRIV_VCL_MAGIC);
 	AN(priv_vcl->foo);
 	free(priv_vcl->foo);
+	if (priv_vcl->exp_cb != NULL) {
+		CHECK_OBJ_NOTNULL(priv_vcl->exp_cb, EXP_CALLBACK_MAGIC);
+		EXP_Dereg_Callback(priv_vcl->exp_cb);
+		FREE_OBJ(priv_vcl->exp_cb);
+		AZ(priv_vcl->exp_cb);
+		VSL(SLT_Debug, 0, "exp_cb: deregistered");
+	}
 	FREE_OBJ(priv_vcl);
 	AZ(priv_vcl);
 }
-- 
2.1.4




More information about the varnish-dev mailing list