[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