[master] c1196bb7a Introduce the new unified import structure.

Poul-Henning Kamp phk at FreeBSD.org
Mon May 27 08:41:08 UTC 2019


commit c1196bb7a7dde648e9ea3bb40ca5ef7939944af0
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon May 27 08:40:17 2019 +0000

    Introduce the new unified import structure.

diff --git a/bin/varnishd/mgt/mgt_symtab.c b/bin/varnishd/mgt/mgt_symtab.c
index fff79a785..4a5dc96e3 100644
--- a/bin/varnishd/mgt/mgt_symtab.c
+++ b/bin/varnishd/mgt/mgt_symtab.c
@@ -59,15 +59,18 @@ mgt_vcl_symtab_val(const struct vjsn_val *vv, const char *val)
 }
 
 static void
-mgt_vcl_import_vcl(struct vclprog *vp1, const struct vjsn_val *vv)
+mgt_vcl_import_vcl(struct vclprog *vp1, struct import *ip, const struct vjsn_val *vv)
 {
 	struct vclprog *vp2;
 
 	CHECK_OBJ_NOTNULL(vp1, VCLPROG_MAGIC);
+	AN(ip);
 	AN(vv);
 
 	vp2 = mcf_vcl_byname(mgt_vcl_symtab_val(vv, "name"));
 	CHECK_OBJ_NOTNULL(vp2, VCLPROG_MAGIC);
+	ip->vcl = vp2;
+	VTAILQ_INSERT_TAIL(&vp2->exports, ip, to);
 	mgt_vcl_dep_add(vp1, vp2);
 }
 
@@ -114,7 +117,7 @@ mgt_vcl_cache_vmod(const char *nm, const char *fm, const char *to)
 }
 
 static void
-mgt_vcl_import_vmod(struct vclprog *vp, const struct vjsn_val *vv)
+mgt_vcl_import_vmod(struct vclprog *vp, struct import *ip, const struct vjsn_val *vv)
 {
 	struct vmodfile *vf;
 	struct vmoddep *vd;
@@ -123,6 +126,7 @@ mgt_vcl_import_vmod(struct vclprog *vp, const struct vjsn_val *vv)
 	const char *v_dst;
 
 	CHECK_OBJ_NOTNULL(vp, VCLPROG_MAGIC);
+	AN(ip);
 	AN(vv);
 
 	v_name = mgt_vcl_symtab_val(vv, "name");
@@ -138,6 +142,7 @@ mgt_vcl_import_vmod(struct vclprog *vp, const struct vjsn_val *vv)
 		REPLACE(vf->fname, v_dst);
 		AN(vf->fname);
 		VTAILQ_INIT(&vf->vcls);
+		VTAILQ_INIT(&vf->exports);
 		AZ(mgt_vcl_cache_vmod(v_name, v_file, v_dst));
 		VTAILQ_INSERT_TAIL(&vmodhead, vf, list);
 	}
@@ -146,6 +151,8 @@ mgt_vcl_import_vmod(struct vclprog *vp, const struct vjsn_val *vv)
 	vd->to = vf;
 	VTAILQ_INSERT_TAIL(&vp->vmods, vd, lfrom);
 	VTAILQ_INSERT_TAIL(&vf->vcls, vd, lto);
+	ip->vmod = vf;
+	VTAILQ_INSERT_TAIL(&vf->exports, ip, to);
 }
 
 void
@@ -154,6 +161,7 @@ mgt_vcl_symtab(struct vclprog *vp, const char *input)
 	struct vjsn *vj;
 	struct vjsn_val *v1, *v2;
 	const char *typ, *err;
+	struct import *ip;
 
 	CHECK_OBJ_NOTNULL(vp, VCLPROG_MAGIC);
 	AN(input);
@@ -174,16 +182,38 @@ mgt_vcl_symtab(struct vclprog *vp, const char *input)
 		assert(v2->type == VJSN_STRING);
 		if (strcmp(v2->value, "import"))
 			continue;
+		ALLOC_OBJ(ip, IMPORT_MAGIC);
+		AN(ip);
+		ip->vj = v1;
+		ip->target = vp;
+		VTAILQ_INSERT_TAIL(&vp->imports, ip, from);
 		typ = mgt_vcl_symtab_val(v1, "type");
 		if (!strcmp(typ, "$VMOD"))
-			mgt_vcl_import_vmod(vp, v1);
+			mgt_vcl_import_vmod(vp, ip, v1);
 		else if (!strcmp(typ, "$VCL"))
-			mgt_vcl_import_vcl(vp, v1);
+			mgt_vcl_import_vcl(vp, ip, v1);
 		else
 			WRONG("Bad symtab import entry");
 	}
 }
 
+void
+mgt_vcl_symtab_clean(struct vclprog *vp)
+{
+	struct import *ip;
+
+	if (vp->symtab)
+		vjsn_delete(&vp->symtab);
+	while (!VTAILQ_EMPTY(&vp->imports)) {
+		ip = VTAILQ_FIRST(&vp->imports);
+		VTAILQ_REMOVE(&vp->imports, ip, from);
+		if (ip->vmod)
+			VTAILQ_REMOVE(&ip->vmod->exports, ip, to);
+		if (ip->vcl)
+			VTAILQ_REMOVE(&ip->vcl->exports, ip, to);
+		FREE_OBJ(ip);
+	}
+}
 
 /*--------------------------------------------------------------------*/
 
@@ -221,11 +251,22 @@ void v_matchproto_(cli_func_t)
 mcf_vcl_symtab(struct cli *cli, const char * const *av, void *priv)
 {
 	struct vclprog *vp;
+	struct import *ip;
 	(void)av;
 	(void)priv;
 	VTAILQ_FOREACH(vp, &vclhead, list) {
 		VCLI_Out(cli, "VCL: %s\n", vp->name);
-		if (vp->symtab != NULL)
-			mcf_vcl_vjsn_dump(cli, vp->symtab->value, 4);
+		VCLI_Out(cli, "  imports:\n");
+		VTAILQ_FOREACH(ip, &vp->imports, from) {
+			VCLI_Out(cli, "    %p -> (%p, %p)\n",
+				ip, ip->vcl, ip->vmod);
+			mcf_vcl_vjsn_dump(cli, ip->vj, 6);
+		}
+		VCLI_Out(cli, "  exports:\n");
+		VTAILQ_FOREACH(ip, &vp->exports, to) {
+			VCLI_Out(cli, "    %p -> (%p, %p) %s\n",
+				ip, ip->vcl, ip->vmod, ip->target->name);
+			mcf_vcl_vjsn_dump(cli, ip->vj, 6);
+		}
 	}
 }
diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index 147eaed90..892605630 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -43,7 +43,6 @@
 #include "vcli_serve.h"
 #include "vct.h"
 #include "vev.h"
-#include "vjsn.h"
 #include "vtim.h"
 
 #define VCL_STATE(sym, str)					\
@@ -199,9 +198,11 @@ mgt_vcl_add(const char *name, const char *state)
 	ALLOC_OBJ(vp, VCLPROG_MAGIC);
 	XXXAN(vp);
 	REPLACE(vp->name, name);
+	VTAILQ_INIT(&vp->exports);
 	VTAILQ_INIT(&vp->dfrom);
 	VTAILQ_INIT(&vp->dto);
 	VTAILQ_INIT(&vp->vmods);
+	VTAILQ_INIT(&vp->imports);
 	vp->state = state;
 
 	if (vp->state != VCL_STATE_COLD)
@@ -264,8 +265,7 @@ mgt_vcl_del(struct vclprog *vp)
 		}
 	}
 	free(vp->name);
-	if (vp->symtab)
-		vjsn_delete(&vp->symtab);
+	mgt_vcl_symtab_clean(vp);
 	FREE_OBJ(vp);
 }
 
diff --git a/bin/varnishd/mgt/mgt_vcl.h b/bin/varnishd/mgt/mgt_vcl.h
index fe740dde4..49adcdf51 100644
--- a/bin/varnishd/mgt/mgt_vcl.h
+++ b/bin/varnishd/mgt/mgt_vcl.h
@@ -30,6 +30,18 @@
 
 struct vclprog;
 struct vmodfile;
+struct vjsn_val;
+
+struct import {
+	unsigned		magic;
+#define IMPORT_MAGIC		0xce767c9b
+	struct vclprog		*target;
+	VTAILQ_ENTRY(import)	from;
+	VTAILQ_ENTRY(import)	to;
+	struct vjsn_val		*vj;
+	struct vmodfile		*vmod;
+	struct vclprog		*vcl;
+};
 
 struct vmoddep {
 	unsigned		magic;
@@ -58,6 +70,8 @@ struct vclprog {
 	const char *		state;
 	double			go_cold;
 	struct vjsn		*symtab;
+	VTAILQ_HEAD(, import)	imports;
+	VTAILQ_HEAD(, import)	exports;
 	VTAILQ_HEAD(, vcldep)	dfrom;
 	VTAILQ_HEAD(, vcldep)	dto;
 	int			nto;
@@ -69,6 +83,7 @@ struct vmodfile {
 	unsigned		magic;
 #define VMODFILE_MAGIC		0xffa1a0d5
 	char			*fname;
+	VTAILQ_HEAD(, import)	exports;
 	VTAILQ_ENTRY(vmodfile)	list;
 	VTAILQ_HEAD(, vmoddep)	vcls;
 };
@@ -80,6 +95,7 @@ struct vclprog *mcf_vcl_byname(const char *name);
 void mgt_vcl_dep_add(struct vclprog *vp_from, struct vclprog *vp_to);
 int mcf_is_label(const struct vclprog *vp);
 
+void mgt_vcl_symtab_clean(struct vclprog *vp);
 void mgt_vcl_export_labels(struct vcc *vcc);
 void mgt_vcl_symtab(struct vclprog *vp, const char *input);
 void mcf_vcl_symtab(struct cli *cli, const char * const *av, void *priv);
diff --git a/bin/varnishtest/tests/c00077.vtc b/bin/varnishtest/tests/c00077.vtc
index 78b9002f9..060d577f9 100644
--- a/bin/varnishtest/tests/c00077.vtc
+++ b/bin/varnishtest/tests/c00077.vtc
@@ -51,8 +51,8 @@ client c1 {
 
 delay .2
 
-varnish v1 -vcl+backend { sub vcl_recv { return (vcl(vclA)); } }
-varnish v1 -vcl+backend { sub vcl_recv { return (vcl(vclA)); } }
+varnish v1 -vcl+backend { import std; sub vcl_recv { return (vcl(vclA)); } }
+varnish v1 -vcl+backend { import debug; sub vcl_recv { return (vcl(vclA)); } }
 varnish v1 -vcl+backend { sub vcl_recv { return (vcl(vclA)); } }
 varnish v1 -vcl+backend { sub vcl_recv { return (vcl(vclA)); } }
 


More information about the varnish-commit mailing list