[master] 263bb06 Expand inifin mechanism to also handle events

Poul-Henning Kamp phk at FreeBSD.org
Wed Dec 10 15:18:57 CET 2014


commit 263bb0643ad99ba9a0cedc3e4e000a2ad74f24a4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Dec 10 13:27:44 2014 +0000

    Expand inifin mechanism to also handle events

diff --git a/lib/libvcc/vcc_compile.c b/lib/libvcc/vcc_compile.c
index 9aabb59..32dc8f2 100644
--- a/lib/libvcc/vcc_compile.c
+++ b/lib/libvcc/vcc_compile.c
@@ -134,6 +134,7 @@ New_IniFin(struct vcc *tl)
 	p->magic = INIFIN_MAGIC;
 	p->ini = VSB_new_auto();
 	p->fin = VSB_new_auto();
+	p->event = VSB_new_auto();
 	p->n = ++tl->ninifin;
 	VTAILQ_INSERT_TAIL(&tl->inifin, p, list);
 	return (p);
@@ -295,13 +296,22 @@ LocTable(const struct vcc *tl)
 	Fc(tl, 0, "};\n");
 }
 
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * Init/Fini/Event
+ *
+ * We call Fini-s in the opposite order of init-s.
+ * Other events are called in same order as init-s, no matter which
+ * event it might be.
+ */
 
 static void
-EmitInitFunc(const struct vcc *tl)
+EmitInitFini(const struct vcc *tl)
 {
 	struct inifin *p;
 
+	/*
+	 * INIT
+	 */
 	Fc(tl, 0, "\nstatic int\nVGC_Init(VRT_CTX)\n{\n\n");
 	VTAILQ_FOREACH(p, &tl->inifin, list) {
 		AZ(VSB_finish(p->ini));
@@ -312,14 +322,11 @@ EmitInitFunc(const struct vcc *tl)
 
 	Fc(tl, 0, "\treturn(0);\n");
 	Fc(tl, 0, "}\n");
-}
-
-static void
-EmitFiniFunc(const struct vcc *tl)
-{
-	struct inifin *p;
 
-	Fc(tl, 0, "\nstatic void\nVGC_Fini(VRT_CTX)\n{\n\n");
+	/*
+	 * FINI
+	 */
+	Fc(tl, 0, "\nstatic int\nVGC_Fini(VRT_CTX)\n{\n\n");
 
 	VTAILQ_FOREACH_REVERSE(p, &tl->inifin, inifinhead, list) {
 		AZ(VSB_finish(p->fin));
@@ -328,6 +335,28 @@ EmitFiniFunc(const struct vcc *tl)
 		VSB_delete(p->fin);
 	}
 
+	Fc(tl, 0, "\treturn(0);\n");
+	Fc(tl, 0, "}\n");
+
+	/*
+	 * EVENTS
+	 */
+	Fc(tl, 0, "\nstatic int\n");
+	Fc(tl, 0, "VGC_Event(VRT_CTX, enum vcl_event_e ev)\n");
+	Fc(tl, 0, "{\n");
+	Fc(tl, 0, "\tif (ev == VCL_EVENT_INIT)\n");
+	Fc(tl, 0, "\t\treturn(VGC_Init(ctx));\n");
+	Fc(tl, 0, "\telse if (ev == VCL_EVENT_FINI)\n");
+	Fc(tl, 0, "\t\treturn(VGC_Fini(ctx));\n");
+	Fc(tl, 0, "\telse {\n");
+	VTAILQ_FOREACH(p, &tl->inifin, list) {
+		AZ(VSB_finish(p->event));
+		if (VSB_len(p->event))
+			Fc(tl, 0, "\t/* %u */\n%s\n", p->n, VSB_data(p->event));
+		VSB_delete(p->event);
+	}
+	Fc(tl, 0, "\t\treturn (0);\n");
+	Fc(tl, 0, "\t}\n");
 	Fc(tl, 0, "}\n");
 }
 
@@ -362,18 +391,6 @@ EmitStruct(const struct vcc *tl)
 	Fc(tl, 0, "\nstatic struct director\t*directors[%d];\n",
 	    tl->ndirector);
 
-	Fc(tl, 0, "\nstatic int\n");
-	Fc(tl, 0, "VGC_Event(VRT_CTX, enum vcl_event_e ev)\n");
-	Fc(tl, 0, "{\n");
-	Fc(tl, 0, "\tif (ev == VCL_EVENT_INIT)\n");
-	Fc(tl, 0, "\t\treturn(VGC_Init(ctx));\n");
-	Fc(tl, 0, "\telse if (ev == VCL_EVENT_FINI) {\n");
-	Fc(tl, 0, "\t\tVGC_Fini(ctx);\n");
-	Fc(tl, 0, "\t\treturn(0);\n");
-	Fc(tl, 0, "\t} else\n");
-	Fc(tl, 0, "\t\treturn (-1);\n");
-	Fc(tl, 0, "}\n");
-
 	Fc(tl, 0, "\nconst struct VCL_conf VCL_conf = {\n");
 	Fc(tl, 0, "\t.magic = VCL_CONF_MAGIC,\n");
 	Fc(tl, 0, "\t.event_vcl = VGC_Event,\n");
@@ -696,9 +713,7 @@ vcc_CompileSource(const struct vcc *tl0, struct vsb *sb, struct source *sp)
 
 	LocTable(tl);
 
-	EmitInitFunc(tl);
-
-	EmitFiniFunc(tl);
+	EmitInitFini(tl);
 
 	EmitStruct(tl);
 
diff --git a/lib/libvcc/vcc_compile.h b/lib/libvcc/vcc_compile.h
index 128916b..9bc102c 100644
--- a/lib/libvcc/vcc_compile.h
+++ b/lib/libvcc/vcc_compile.h
@@ -150,6 +150,7 @@ struct inifin {
 	unsigned		n;
 	struct vsb		*ini;
 	struct vsb		*fin;
+	struct vsb		*event;
 	VTAILQ_ENTRY(inifin)	list;
 };
 



More information about the varnish-commit mailing list