[master] 20ab2abc3 Only dlclose() Vmods after all "fini" processing.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Aug 30 07:55:13 UTC 2018
commit 20ab2abc36781b03605785c0a9ae463460cdffef
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Aug 30 07:53:32 2018 +0000
Only dlclose() Vmods after all "fini" processing.
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index cf8a952db..dd3267ea2 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -533,7 +533,7 @@ vcl_cancel_load(VRT_CTX, struct cli *cli, const char *name, const char *step)
if (VSB_len(ctx->msg))
VCLI_Out(cli, "\nMessage:\n\t%s", VSB_data(ctx->msg));
*ctx->handling = 0;
- AZ(vcl->conf->event_vcl(ctx, VCL_EVENT_DISCARD));
+ AZ(vcl_send_event(ctx, VCL_EVENT_DISCARD));
vcl_KillBackends(vcl);
free(vcl->loaded_name);
VCL_Close(&vcl);
diff --git a/bin/varnishd/cache/cache_vrt_vmod.c b/bin/varnishd/cache/cache_vrt_vmod.c
index 25a119da4..af49ef40b 100644
--- a/bin/varnishd/cache/cache_vrt_vmod.c
+++ b/bin/varnishd/cache/cache_vrt_vmod.c
@@ -162,7 +162,7 @@ VRT_Vmod_Init(VRT_CTX, struct vmod **hdl, unsigned nbr, void *ptr, int len,
}
void
-VRT_Vmod_Fini(struct vmod **hdl)
+VRT_Vmod_Unload(VRT_CTX, struct vmod **hdl)
{
struct vmod *v;
@@ -170,6 +170,9 @@ VRT_Vmod_Fini(struct vmod **hdl)
TAKE_OBJ_NOTNULL(v, hdl, VMOD_MAGIC);
+ VCL_TaskLeave(ctx->vcl, cli_task_privs);
+ VCL_TaskEnter(ctx->vcl, cli_task_privs);
+
#ifndef DONT_DLCLOSE_VMODS
/*
* atexit(3) handlers are not called during dlclose(3). We don't
diff --git a/include/vrt.h b/include/vrt.h
index f49478fc2..0d76b2be5 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -59,6 +59,7 @@
* VRT_STRANDS_string() removed from vrt.h (never implemented)
* VRT_Healthy() changed prototype
* VRT_Vmod_Init signature changed
+ * VRT_Vmod_Fini changed to VRT_Vmod_Unload
* 7.0 (2018-03-15)
* lots of stuff moved from cache.h to cache_varnishd.h
* (ie: from "$Abi vrt" to "$Abi strict")
@@ -474,7 +475,7 @@ int VRT_VSA_GetPtr(const struct suckaddr *sua, const unsigned char ** dst);
/* VMOD/Modules related */
int VRT_Vmod_Init(VRT_CTX, struct vmod **hdl, unsigned nbr, void *ptr, int len,
const char *nm, const char *path, const char *file_id, const char *backup);
-void VRT_Vmod_Fini(struct vmod **hdl);
+void VRT_Vmod_Unload(VRT_CTX, struct vmod **hdl);
/* VCL program related */
VCL_VCL VRT_vcl_get(VRT_CTX, const char *);
diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 1adc26721..bcfaadcab 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -139,12 +139,16 @@ New_IniFin(struct vcc *tl)
{
struct inifin *p;
- p = TlAlloc(tl, sizeof *p);
+ ALLOC_OBJ(p, INIFIN_MAGIC);
AN(p);
- p->magic = INIFIN_MAGIC;
p->ini = VSB_new_auto();
+ AN(p->ini);
p->fin = VSB_new_auto();
+ AN(p->fin);
+ p->final = VSB_new_auto();
+ AN(p->final);
p->event = VSB_new_auto();
+ AN(p->event);
p->n = ++tl->ninifin;
VTAILQ_INSERT_TAIL(&tl->inifin, p, list);
return (p);
@@ -324,20 +328,31 @@ EmitInitFini(const struct vcc *tl)
*/
Fc(tl, 0, "\nstatic int\nVGC_Discard(VRT_CTX)\n{\n\n");
- Fc(tl, 0, "\tswitch (vgc_inistep) {\n\n");
+ Fc(tl, 0, "\tswitch (vgc_inistep) {\n");
VTAILQ_FOREACH_REVERSE(p, &tl->inifin, inifinhead, list) {
AZ(VSB_finish(p->fin));
if (q)
assert(q->n > p->n);
q = p;
- if (VSB_len(p->fin)) {
- Fc(tl, 0, "\t\tcase %u :\n", p->n);
+ Fc(tl, 0, "\t\tcase %u:\n", p->n);
+ if (VSB_len(p->fin))
Fc(tl, 0, "\t%s\n", VSB_data(p->fin));
- Fc(tl, 0, "\t\t\t/* FALLTHROUGH */\n");
- }
+ Fc(tl, 0, "\t\t\t/* FALLTHROUGH */\n");
VSB_destroy(&p->fin);
}
- Fc(tl, 0, "\t}\n");
+ Fc(tl, 0, "\t\tdefault:\n\t\t\tbreak;\n");
+ Fc(tl, 0, "\t}\n\n");
+ Fc(tl, 0, "\tswitch (vgc_inistep) {\n");
+ VTAILQ_FOREACH_REVERSE(p, &tl->inifin, inifinhead, list) {
+ AZ(VSB_finish(p->final));
+ Fc(tl, 0, "\t\tcase %u:\n", p->n);
+ if (VSB_len(p->final))
+ Fc(tl, 0, "\t%s\n", VSB_data(p->final));
+ Fc(tl, 0, "\t\t\t/* FALLTHROUGH */\n");
+ VSB_destroy(&p->final);
+ }
+ Fc(tl, 0, "\t\tdefault:\n\t\t\tbreak;\n");
+ Fc(tl, 0, "\t}\n\n");
Fc(tl, 0, "\treturn (0);\n");
Fc(tl, 0, "}\n");
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 4e67b538c..3a98c76e0 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -201,6 +201,7 @@ struct inifin {
unsigned n;
struct vsb *ini;
struct vsb *fin;
+ struct vsb *final;
struct vsb *event;
VTAILQ_ENTRY(inifin) list;
};
diff --git a/lib/libvcc/vcc_vmod.c b/lib/libvcc/vcc_vmod.c
index fd6a7acc6..babd70eef 100644
--- a/lib/libvcc/vcc_vmod.c
+++ b/lib/libvcc/vcc_vmod.c
@@ -105,7 +105,7 @@ vcc_json_always(struct vcc *tl, const struct symbol *msym)
vv2->value, msym->name);
VSB_printf(ifp->fin,
"\t\t(void)%s(ctx, &vmod_priv_%s,\n"
- "\t\t\t VCL_EVENT_DISCARD);\n",
+ "\t\t\t VCL_EVENT_DISCARD);",
vv2->value, msym->name);
VSB_printf(ifp->event, "%s(ctx, &vmod_priv_%s, ev)",
vv2->value, msym->name);
@@ -324,8 +324,9 @@ vcc_ParseImport(struct vcc *tl)
VCC_INFO_PREFIX, fnp, PF(mod), vmd->file_id);
/* XXX: zero the function pointer structure ?*/
- VSB_printf(ifp->fin, "\t\tVRT_priv_fini(&vmod_priv_%.*s);\n", PF(mod));
- VSB_printf(ifp->fin, "\t\t\tVRT_Vmod_Fini(&VGC_vmod_%.*s);", PF(mod));
+ VSB_printf(ifp->fin, "\t\tVRT_priv_fini(&vmod_priv_%.*s);", PF(mod));
+ VSB_printf(ifp->final,
+ "\t\tVRT_Vmod_Unload(ctx, &VGC_vmod_%.*s);", PF(mod));
vj = vjsn_parse(vmd->json, &p);
XXXAZ(p);
More information about the varnish-commit
mailing list