[6.0] 48c3503bc Only dlclose() Vmods after all "fini" processing.
Dridi Boukelmoune
dridi.boukelmoune at gmail.com
Wed Oct 31 13:08:10 UTC 2018
commit 48c3503bc808c41fd28cdd4f8945c51eb837b002
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Aug 30 07:53:32 2018 +0000
Only dlclose() Vmods after all "fini" processing.
Conflicts:
include/vrt.h
This appears to break the VRT interface, but there are symbols we are
willing to break even on a stable branch because they are needed by
VCC-generated code and off limits to inline C and VMODs.
Refs #2800
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index 9bd2dee51..e705a86a1 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -532,7 +532,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 2fc7c60cc..3db7c0438 100644
--- a/include/vrt.h
+++ b/include/vrt.h
@@ -425,7 +425,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