[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