[master] 1bb782cb9 vcl: Use a static discard list

Nils Goroll nils.goroll at uplex.de
Tue Jan 12 15:34:07 UTC 2021


commit 1bb782cb99e8ca1ef91ed48c7460873bb1559266
Author: Dridi Boukelmoune <dridi.boukelmoune at gmail.com>
Date:   Tue Dec 8 18:51:18 2020 +0100

    vcl: Use a static discard list
    
    And assert that it is emptied after all vcl.discard commands.
    
    Better diff with the --word-diff --word-diff-regex='\w+' options.

diff --git a/bin/varnishd/mgt/mgt_vcl.c b/bin/varnishd/mgt/mgt_vcl.c
index 705de26ce..c934c8114 100644
--- a/bin/varnishd/mgt/mgt_vcl.c
+++ b/bin/varnishd/mgt/mgt_vcl.c
@@ -61,6 +61,7 @@ static const struct vclstate VCL_STATE_LABEL[1] = {{ "label" }};
 static unsigned vcl_count;
 
 struct vclproghead vclhead = VTAILQ_HEAD_INITIALIZER(vclhead);
+struct vclproghead discardhead = VTAILQ_HEAD_INITIALIZER(discardhead);
 struct vmodfilehead vmodhead = VTAILQ_HEAD_INITIALIZER(vmodhead);
 static struct vclprog		*active_vcl;
 static struct vev *e_poker;
@@ -658,7 +659,7 @@ mcf_vcl_use(struct cli *cli, const char * const *av, void *priv)
 }
 
 static void
-mgt_vcl_discard(struct cli *cli, struct vclproghead *vh, struct vclprog *vp)
+mgt_vcl_discard(struct cli *cli, struct vclprog *vp)
 {
 	char *p = NULL;
 	unsigned status;
@@ -668,7 +669,7 @@ mgt_vcl_discard(struct cli *cli, struct vclproghead *vh, struct vclprog *vp)
 	assert(vp != active_vcl);
 
 	while (!VTAILQ_EMPTY(&vp->dto))
-		mgt_vcl_discard(cli, vh, VTAILQ_FIRST(&vp->dto)->from);
+		mgt_vcl_discard(cli, VTAILQ_FIRST(&vp->dto)->from);
 
 	if (mcf_is_label(vp)) {
 		AN(vp->warm);
@@ -682,12 +683,12 @@ mgt_vcl_discard(struct cli *cli, struct vclproghead *vh, struct vclprog *vp)
 			assert(status == CLIS_OK || status == CLIS_COMMS);
 		free(p);
 	}
-	VTAILQ_REMOVE(vh, vp, discard_list);
+	VTAILQ_REMOVE(&discardhead, vp, discard_list);
 	mgt_vcl_del(vp);
 }
 
 static int
-mgt_vcl_discard_mark(struct cli *cli, struct vclproghead *vh, const char *glob)
+mgt_vcl_discard_mark(struct cli *cli, const char *glob)
 {
 	struct vclprog *vp;
 	unsigned marked = 0;
@@ -702,7 +703,7 @@ mgt_vcl_discard_mark(struct cli *cli, struct vclproghead *vh, const char *glob)
 			return (-1);
 		}
 		if (!vp->discard)
-			VTAILQ_INSERT_TAIL(vh, vp, discard_list);
+			VTAILQ_INSERT_TAIL(&discardhead, vp, discard_list);
 		vp->discard = 1;
 		marked++;
 	}
@@ -745,12 +746,12 @@ mgt_vcl_discard_depfail(struct cli *cli, struct vclprog *vp)
 }
 
 static int
-mgt_vcl_discard_depcheck(struct cli *cli, struct vclproghead *vh)
+mgt_vcl_discard_depcheck(struct cli *cli)
 {
 	struct vclprog *vp;
 	struct vcldep *vd;
 
-	VTAILQ_FOREACH(vp, vh, list) {
+	VTAILQ_FOREACH(vp, &discardhead, list) {
 		VTAILQ_FOREACH(vd, &vp->dto, lto)
 			if (!vd->from->discard) {
 				mgt_vcl_discard_depfail(cli, vp);
@@ -762,37 +763,36 @@ mgt_vcl_discard_depcheck(struct cli *cli, struct vclproghead *vh)
 }
 
 static void
-mgt_vcl_discard_clear(struct vclproghead *vh)
+mgt_vcl_discard_clear(void)
 {
 	struct vclprog *vp, *vp2;
 
-	VTAILQ_FOREACH_SAFE(vp, vh, discard_list, vp2) {
+	VTAILQ_FOREACH_SAFE(vp, &discardhead, discard_list, vp2) {
 		AN(vp->discard);
 		vp->discard = 0;
-		VTAILQ_REMOVE(vh, vp, discard_list);
+		VTAILQ_REMOVE(&discardhead, vp, discard_list);
 	}
 }
 
 static void v_matchproto_(cli_func_t)
 mcf_vcl_discard(struct cli *cli, const char * const *av, void *priv)
 {
-	struct vclproghead vh[1];
 
 	(void)priv;
 
-	VTAILQ_INIT(vh);
+	assert(VTAILQ_EMPTY(&discardhead));
 	for (av += 2; *av != NULL; av++) {
-		if (mgt_vcl_discard_mark(cli, vh, *av) <= 0) {
-			mgt_vcl_discard_clear(vh);
+		if (mgt_vcl_discard_mark(cli, *av) <= 0) {
+			mgt_vcl_discard_clear();
 			break;
 		}
 	}
 
-	if (mgt_vcl_discard_depcheck(cli, vh) != 0)
-		mgt_vcl_discard_clear(vh);
+	if (mgt_vcl_discard_depcheck(cli) != 0)
+		mgt_vcl_discard_clear();
 
-	while (!VTAILQ_EMPTY(vh))
-		mgt_vcl_discard(cli, vh, VTAILQ_FIRST(vh));
+	while (!VTAILQ_EMPTY(&discardhead))
+		mgt_vcl_discard(cli, VTAILQ_FIRST(&discardhead));
 }
 
 static void v_matchproto_(cli_func_t)


More information about the varnish-commit mailing list