[master] fe01da5 Go through the VMOD reference page

Poul-Henning Kamp phk at varnish-cache.org
Wed Nov 13 11:39:17 CET 2013


commit fe01da5ce66e721745c1ee3f2f4f196478419376
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Nov 13 10:38:51 2013 +0000

    Go through the VMOD reference page

diff --git a/doc/sphinx/reference/vmod.rst b/doc/sphinx/reference/vmod.rst
index 1cfaf25..62803e5 100644
--- a/doc/sphinx/reference/vmod.rst
+++ b/doc/sphinx/reference/vmod.rst
@@ -101,8 +101,9 @@ VCL and C data types
 
 VCL data types are targeted at the job, so for instance, we have data
 types like "DURATION" and "HEADER", but they all have some kind of C
-language representation.  Here is a description of them, from simple
-to nasty.
+language representation.  Here is a description of them.
+
+All but the STRING_LIST type have typedefs:  VCL_INT, VCL_REAL etc.
 
 INT
 	C-type: ``int``
@@ -144,7 +145,7 @@ STRING
 	When used as a return value, the producing function is
 	responsible for arranging memory management.  Either by
 	freeing the string later by whatever means available or
-	by using storage allocated from the session or worker
+	by using storage allocated from the client or backend
 	workspaces.
 
 STRING_LIST
@@ -152,8 +153,8 @@ STRING_LIST
 
 	A multi-component text-string.  We try very hard to avoid
 	doing text-processing in Varnish, and this is one way we
-	do that, by not editing separate pieces of a sting together
-	to one string, until we need to.
+	to avoid that, by not editing separate pieces of a sting
+	together to one string, unless we have to.
 
 	Consider this contrived example::
 
@@ -179,7 +180,8 @@ STRING_LIST
 	a function, we may relax that at a latter time.
 
 	If you don't want to bother with STRING_LIST, just use STRING
-	and make sure your thread_pool_workspace param is big enough.
+	and make sure your workspace_client and workspace_backend params
+	are big enough.
 
 PRIV_VCL
 	See below
@@ -194,12 +196,22 @@ VOID
 	procedure.
 
 HEADER
-	C-type: ``enum gethdr_e, const char *``
+	C-type: ``const struct gethdr_s *''
+
+	These are VCL compiler generated constants referencing
+	a particular header in a particular HTTP entity, for instance
+	``req.http.cookie'' or ``beresp.http.last-modified''
+
+IP
+	C-type: ``const struct suckaddr *''
+
+	This is an opaque type, see the ``include/vsa.h`` file for
+	which primitives we support on this type.
 
-	XXX: explain me
+BOOL
+	C-type: ``unsigned''
 
-IP, BOOL
-	XXX: these types are not released for use in vmods yet.
+	Zero means false, anything else means true.
 
 
 Private Pointers
@@ -243,7 +255,24 @@ pointer points to.
 When a VCL program is discarded, all private pointers are checked
 to see if both the "priv" and "free" elements are non-NULL, and if
 they are, the "free" function will be called with the "priv" pointer
-as only argument.
+as the only argument.
+
+In the common case where a private data structure is allocated with
+malloc would look like this::
+
+	if (priv->priv == NULL) {
+		priv->priv = calloc(sizeof(struct myfoo), 1);
+		AN(priv->priv);
+		priv->priv = free;	/* free(3) */
+		mystate = priv->priv;
+		mystate->foo = 21;
+		...
+	} else {
+		mystate = priv->priv;
+	}
+	if (foo > 25) {
+		...
+	}
 
 The per-call vmod_privs are freed before the per-vcl vmod_priv.
 
@@ -251,15 +280,15 @@ Init functions
 ==============
 
 VMODs can have an "init" method which is called when a VCL
-which imports the VMOD is initialized.
+which imports the VMOD is loaded.
 
 The first argument to the init function is the vmod_priv specific
 to this particular VCL, and if necessary, a VCL specific VMOD "fini"
 function can be attached to its "free" hook.
 
-(The second argument is a pointer to the VCL's config structure,
-it is not at all obvious what you can use this for in practice,
-but we provide it just in case.)
+The second argument is a pointer to the VCL's config structure,
+which allows you to tell different VCLs which import this module
+apart.
 
 Please notice that there is no "global" fini method.
 
@@ -275,11 +304,14 @@ When to lock, and when not to lock
 Varnish is heavily multithreaded, so by default VMODs must implement
 their own locking to protect shared resources.
 
-When a VCL is loaded or unloaded, the initialization and teardown
-is run sequentially in a single thread, and there is guaranteed
+When a VCL is loaded or unloaded, the init and priv->free are
+run sequentially all in a single thread, and there is guaranteed
 to be no other activity related to this particular VCL, nor are
 there  init/fini activity in any other VCL or VMOD at this time.
 
 That means that the VMOD init, and any object init/fini functions
 are already serialized in sensible order, and won't need any locking,
 unless they access VMOD specific global state, shared with other VCLs.
+
+Trafic in other VCLs which also import this VMOD, will be happening
+while housekeeping is going on.



More information about the varnish-commit mailing list