[master] 48b09e9 Only run ->fini steps for ->init steps which succeeded.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Jun 11 11:39:09 CEST 2015
commit 48b09e9d8a90606c45c237ec543ab5925e4d87ca
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Jun 11 09:38:21 2015 +0000
Only run ->fini steps for ->init steps which succeeded.
Patch from Martin, with additional attention to VGC layout by me.
diff --git a/lib/libvcc/vcc_action.c b/lib/libvcc/vcc_action.c
index c4f984d..1ec9d72 100644
--- a/lib/libvcc/vcc_action.c
+++ b/lib/libvcc/vcc_action.c
@@ -221,7 +221,7 @@ parse_new(struct vcc *tl)
bprintf(buf1, ", &vo_%s, \"%s\"", sy1->name, sy1->name);
vcc_Eval_Func(tl, s_init, buf1, sy2->name, s_init + strlen(s_init) + 1);
ifp = New_IniFin(tl);
- VSB_printf(ifp->fin, "\t%s(&vo_%s);", s_fini, sy1->name);
+ VSB_printf(ifp->fin, "\t\t%s(&vo_%s);", s_fini, sy1->name);
ExpectErr(tl, ';');
bprintf(buf1, ", vo_%s", sy1->name);
diff --git a/lib/libvcc/vcc_backend.c b/lib/libvcc/vcc_backend.c
index d788d28..aff800a 100644
--- a/lib/libvcc/vcc_backend.c
+++ b/lib/libvcc/vcc_backend.c
@@ -413,7 +413,7 @@ vcc_ParseHostDef(struct vcc *tl, const struct token *t_be, const char *vgcname)
"\tVRT_init_vbe(ctx, &%s, &vgc_dir_priv_%s);",
vgcname, vgcname);
VSB_printf(ifp->fin,
- "\tVRT_fini_vbe(ctx, &%s, &vgc_dir_priv_%s);",
+ "\t\tVRT_fini_vbe(ctx, &%s,\n\t\t &vgc_dir_priv_%s);",
vgcname, vgcname);
VSB_printf(ifp->event,
"\tVRT_event_vbe(ctx, ev, %s, &vgc_dir_priv_%s);",
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 06f3a3e..735341f 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -309,14 +309,19 @@ EmitInitFini(const struct vcc *tl)
{
struct inifin *p;
+ Fh(tl, 0, "\nstatic unsigned vgc_inistep;\n");
+
/*
* INIT
*/
Fc(tl, 0, "\nstatic int\nVGC_Load(VRT_CTX)\n{\n\n");
+ Fc(tl, 0, "\tvgc_inistep = 0;\n\n");
VTAILQ_FOREACH(p, &tl->inifin, list) {
AZ(VSB_finish(p->ini));
+ assert(p->n > 0);
if (VSB_len(p->ini))
Fc(tl, 0, "\t/* %u */\n%s\n", p->n, VSB_data(p->ini));
+ Fc(tl, 0, "\tvgc_inistep = %u;\n\n", p->n);
VSB_delete(p->ini);
}
@@ -330,8 +335,12 @@ EmitInitFini(const struct vcc *tl)
VTAILQ_FOREACH_REVERSE(p, &tl->inifin, inifinhead, list) {
AZ(VSB_finish(p->fin));
- if (VSB_len(p->fin))
- Fc(tl, 0, "\t/* %u */\n%s\n", p->n, VSB_data(p->fin));
+ if (VSB_len(p->fin)) {
+ Fc(tl, 0, "\t/* %u */\n", p->n);
+ Fc(tl, 0, "\tif (vgc_inistep >= %u) {\n", p->n);
+ Fc(tl, 0, "%s\n", VSB_data(p->fin));
+ Fc(tl, 0, "\t}\n\n");
+ }
VSB_delete(p->fin);
}
diff --git a/lib/libvcc/vcc_utils.c b/lib/libvcc/vcc_utils.c
index 9e8ef9e..c5ea59e 100644
--- a/lib/libvcc/vcc_utils.c
+++ b/lib/libvcc/vcc_utils.c
@@ -75,7 +75,7 @@ vcc_regexp(struct vcc *tl)
VSB_printf(ifp->ini, "\tVRT_re_init(&%s, ",buf);
EncToken(ifp->ini, tl->t);
VSB_printf(ifp->ini, ");");
- VSB_printf(ifp->fin, "\tVRT_re_fini(%s);", buf);
+ VSB_printf(ifp->fin, "\t\tVRT_re_fini(%s);", buf);
return (p);
}
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index 8391c98..9f140db 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -181,8 +181,8 @@ vcc_ParseImport(struct vcc *tl)
VSB_printf(ifp->ini, "\t\treturn(1);");
/* XXX: zero the function pointer structure ?*/
- VSB_printf(ifp->fin, "\tVRT_priv_fini(&vmod_priv_%.*s);", PF(mod));
- VSB_printf(ifp->fin, "\n\tVRT_Vmod_Fini(&VGC_vmod_%.*s);", PF(mod));
+ VSB_printf(ifp->fin, "\t\tVRT_priv_fini(&vmod_priv_%.*s);", PF(mod));
+ VSB_printf(ifp->fin, "\n\t\tVRT_Vmod_Fini(&VGC_vmod_%.*s);", PF(mod));
ifp = NULL;
More information about the varnish-commit
mailing list