r211 - in trunk/varnish-cache: bin/varnishd include lib/libvcl

phk at projects.linpro.no phk at projects.linpro.no
Tue Jun 20 12:31:50 CEST 2006


Author: phk
Date: 2006-06-20 12:31:50 +0200 (Tue, 20 Jun 2006)
New Revision: 211

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_acceptor.c
   trunk/varnish-cache/bin/varnishd/cache_http.c
   trunk/varnish-cache/bin/varnishd/cache_pool.c
   trunk/varnish-cache/bin/varnishd/cache_vrt.c
   trunk/varnish-cache/include/vcl_lang.h
   trunk/varnish-cache/include/vrt.h
   trunk/varnish-cache/lib/libvcl/vcl_compile.c
   trunk/varnish-cache/lib/libvcl/vcl_fixed_token.c
Log:
At the expense of some complexity and a small runtime overhead,
isolate the compiled code from the internal structures of the cache
process through of VRT functions.



Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2006-06-20 10:31:50 UTC (rev 211)
@@ -2,6 +2,8 @@
  * $Id$
  */
 
+#include <sys/queue.h>
+
 struct event_base;
 struct sbuf;
 
@@ -55,6 +57,73 @@
  */
 extern struct stevedore *stevedore;
 
+/* Storage -----------------------------------------------------------*/
+
+struct sess;
+typedef void sesscb_f(struct sess *sp);
+
+#define VCA_ADDRBUFSIZE		32
+
+struct object {	
+	unsigned char		hash[16];
+	unsigned 		refcnt;
+	unsigned		valid;
+	unsigned		cacheable;
+
+	unsigned		busy;
+	unsigned		len;
+
+	char			*header;
+
+	TAILQ_HEAD(, storage)	store;
+};
+
+#define	HND_Error	(1 << 0)
+#define	HND_Pipe	(1 << 1)
+#define	HND_Pass	(1 << 2)
+#define	HND_Lookup	(1 << 3)
+#define	HND_Fetch	(1 << 4)
+#define	HND_Insert	(1 << 5)
+#define	HND_Deliver	(1 << 6)
+
+struct sess {
+	int			fd;
+
+	/* formatted ascii client address */
+	char			addr[VCA_ADDRBUFSIZE];
+
+	/* HTTP request */
+	struct http		*http;
+
+	unsigned 		handling;
+
+	TAILQ_ENTRY(sess)	list;
+
+	sesscb_f		*sesscb;
+
+	struct backend		*backend;
+	struct object		*obj;
+	struct VCL_conf		*vcl;
+
+	/* Various internal stuff */
+	struct event		*rd_e;
+	struct sessmem		*mem;
+};
+
+struct backend {
+	const char	*hostname;
+	const char	*portname;
+	struct addrinfo	*addr;
+	unsigned	ip;
+	double		responsetime;
+	double		timeout;
+	double		bandwidth;
+	int		down;
+
+	/* internal stuff */
+	struct vbe	*vbe;
+};
+
 /* Prototypes etc ----------------------------------------------------*/
 
 

Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_acceptor.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/bin/varnishd/cache_acceptor.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -16,6 +16,7 @@
 #include <sys/uio.h>
 #include <sys/types.h>
 #include <sys/socket.h>
+#include <sys/queue.h>
 
 #include <netdb.h>
 
@@ -25,7 +26,6 @@
 #include "config.h"
 #include "compat.h"
 #include "libvarnish.h"
-#include "vcl_lang.h"
 #include "heritage.h"
 #include "shmlog.h"
 #include "cache.h"

Modified: trunk/varnish-cache/bin/varnishd/cache_http.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_http.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/bin/varnishd/cache_http.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -16,7 +16,6 @@
 
 #include "libvarnish.h"
 #include "shmlog.h"
-#include "vcl_lang.h"
 #include "cache.h"
 
 static unsigned		http_bufsize	= 4096;

Modified: trunk/varnish-cache/bin/varnishd/cache_pool.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_pool.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/bin/varnishd/cache_pool.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -102,7 +102,7 @@
 
 		http_Dissect(sp->http, sp->fd, 1);
 
-		sp->backend = sp->vcl->default_backend;
+		sp->backend = sp->vcl->backend[0];
 
 		VCL_recv_method(sp);
 

Modified: trunk/varnish-cache/bin/varnishd/cache_vrt.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_vrt.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/bin/varnishd/cache_vrt.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -16,9 +16,9 @@
 #include "cli.h"
 #include "cli_priv.h"
 #include "shmlog.h"
-#include "vcl_lang.h"
 #include "vrt.h"
 #include "libvarnish.h"
+#include "vcl_lang.h"
 #include "cache.h"
 
 /*--------------------------------------------------------------------*/
@@ -71,8 +71,58 @@
 /*--------------------------------------------------------------------*/
 
 void
-VRT_handling(struct sess *sp, enum handling hand)
+VRT_handling(struct sess *sp, unsigned hand)
 {
 
-	sp->handling = hand;
+	assert(!(hand & (hand -1)));	/* must be power of two */
+	switch (hand) {
+#define FOO(a,b)  case VRT_H_##a: sp->handling = HND_##b; break;
+	FOO(error, Error);
+	FOO(pipe, Pipe);
+	FOO(pass, Pass);
+	FOO(lookup, Lookup);
+	FOO(fetch, Fetch);
+	FOO(insert, Insert);
+	FOO(deliver, Deliver);
+#undef FOO
+	default:
+		assert(hand == 0);
+	}
 }
+
+int
+VRT_obj_valid(struct sess *sp)
+{
+	return (sp->obj->valid);
+}
+
+int
+VRT_obj_cacheable(struct sess *sp)
+{
+	return (sp->obj->cacheable);
+}
+
+void
+VRT_set_backend_hostname(struct backend *be, const char *h)
+{
+	be->hostname = h;
+}
+
+void
+VRT_set_backend_portname(struct backend *be, const char *p)
+{
+	be->portname = p;
+}
+
+void
+VRT_alloc_backends(struct VCL_conf *cp)
+{
+	int i;
+
+	cp->backend = calloc(sizeof *cp->backend, cp->nbackend);
+	assert(cp->backend != NULL);
+	for (i = 0; i < cp->nbackend; i++) {
+		cp->backend[i] = calloc(sizeof *cp->backend[i], 1);
+		assert(cp->backend[i] != NULL);
+	}
+}

Modified: trunk/varnish-cache/include/vcl_lang.h
===================================================================
--- trunk/varnish-cache/include/vcl_lang.h	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/include/vcl_lang.h	2006-06-20 10:31:50 UTC (rev 211)
@@ -5,80 +5,8 @@
  * XXX: *MUST* be rerun.
  */
 
-/* XXX: This include is bad.  The VCL compiler shouldn't know about it. */
-#include <sys/queue.h>
-
 struct sess;
-typedef void sesscb_f(struct sess *sp);
 
-#define VCA_ADDRBUFSIZE		32
-
-struct object {	
-	unsigned char		hash[16];
-	unsigned 		refcnt;
-	unsigned		valid;
-	unsigned		cacheable;
-
-	unsigned		busy;
-	unsigned		len;
-
-	char			*header;
-
-	TAILQ_HEAD(, storage)	store;
-};
-enum handling {
-	HND_Error	= (1 << 0),
-	HND_Pipe	= (1 << 1),
-	HND_Pass	= (1 << 2),
-	HND_Lookup	= (1 << 3),
-	HND_Fetch	= (1 << 4),
-	HND_Insert	= (1 << 5),
-	HND_Deliver	= (1 << 6),
-};
-
-struct sess {
-	int			fd;
-
-	/* formatted ascii client address */
-	char			addr[VCA_ADDRBUFSIZE];
-
-	/* HTTP request */
-	struct http		*http;
-
-	enum handling		handling;
-
-	TAILQ_ENTRY(sess)	list;
-
-	sesscb_f		*sesscb;
-
-	struct backend		*backend;
-	struct object		*obj;
-	struct VCL_conf		*vcl;
-
-	/* Various internal stuff */
-	struct event		*rd_e;
-	struct sessmem		*mem;
-};
-
-struct backend {
-	const char	*hostname;
-	const char	*portname;
-	struct addrinfo	*addr;
-	unsigned	ip;
-	double		responsetime;
-	double		timeout;
-	double		bandwidth;
-	int		down;
-
-	/* internal stuff */
-	struct vbe	*vbe;
-};
-
-#if 0
-int ip_match(unsigned, struct vcl_acl *);
-int string_match(const char *, const char *);
-#endif
-
 typedef void vcl_init_f(void);
 typedef int vcl_func_f(struct sess *sp);
 
@@ -90,7 +18,8 @@
 	vcl_func_f	*hit_func;
 	vcl_func_f	*miss_func;
 	vcl_func_f	*fetch_func;
-	struct backend	*default_backend;
+	struct backend	**backend;
+	unsigned	nbackend;
 	struct vrt_ref	*ref;
 	unsigned	nref;
 	unsigned	busy;

Modified: trunk/varnish-cache/include/vrt.h
===================================================================
--- trunk/varnish-cache/include/vrt.h	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/include/vrt.h	2006-06-20 10:31:50 UTC (rev 211)
@@ -6,6 +6,18 @@
  * XXX: *MUST* be rerun.
  */
 
+#define	VRT_H_error	(1 << 0)
+#define	VRT_H_pipe	(1 << 1)
+#define	VRT_H_pass	(1 << 2)
+#define	VRT_H_lookup	(1 << 3)
+#define	VRT_H_fetch	(1 << 4)
+#define	VRT_H_insert	(1 << 5)
+#define	VRT_H_deliver	(1 << 6)
+
+struct sess;
+struct backend;
+struct VCL_conf;
+
 struct vrt_ref {
 	unsigned	line;
 	unsigned	pos;
@@ -31,8 +43,15 @@
 
 char *VRT_GetHdr(struct sess *, const char *);
 char *VRT_GetReq(struct sess *);
-void VRT_handling(struct sess *sp, enum handling hand);
+void VRT_handling(struct sess *sp, unsigned hand);
+int VRT_obj_valid(struct sess *);
+int VRT_obj_cachable(struct sess *);
 
+void VRT_set_backend_hostname(struct backend *, const char *);
+void VRT_set_backend_portname(struct backend *, const char *);
+
+void VRT_alloc_backends(struct VCL_conf *cp);
+
 #define VRT_done(sp, hand)			\
 	do {					\
 		VRT_handling(sp, hand);		\

Modified: trunk/varnish-cache/lib/libvcl/vcl_compile.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcl_compile.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/lib/libvcl/vcl_compile.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -76,6 +76,7 @@
 	TAILQ_HEAD(, ref)	refs;
 	struct sbuf		*sb;
 	int			err;
+	int			nbackend;
 };
 
 enum var_type {
@@ -93,12 +94,6 @@
 	HEADER
 };
 
-struct var {
-	const char		*name;
-	enum var_type		fmt;
-	int			len;
-	const char		*cname;
-};
 
 enum ref_type {
 	R_FUNC,
@@ -114,17 +109,26 @@
 	TAILQ_ENTRY(ref)	list;
 };
 
+struct var {
+	const char		*name;
+	enum var_type		fmt;
+	int			len;
+	const char		*rname;
+	const char		*lname;
+};
 
 static struct var be_vars[] = {
-	{ "backend.host",		HOSTNAME, 0,  "backend->hostname"    },
-	{ "backend.port",		PORTNAME, 0,  "backend->portname"    },
+	{ "backend.host",
+		HOSTNAME, 0,  NULL, "VRT_set_backend_hostname(backend, %s)" },
+	{ "backend.port",
+		PORTNAME, 0,  NULL, "VRT_set_backend_portname(backend, %s)" },
 };
 
 
 static struct var vars[] = {
 	{ "req.request",		STRING,	  0,  "VRT_GetReq(sp)"	     },
-	{ "obj.valid",			BOOL,	  0,  "sp->obj->valid"     },
-	{ "obj.cacheable",		BOOL,	  0,  "sp->obj->cacheable" },
+	{ "obj.valid",			BOOL,	  0,  "VRT_obj_valid(sp)"     },
+	{ "obj.cacheable",		BOOL,	  0,  "VRT_obj_cacheable(sp)" },
 	{ "req.http.",			HEADER,	  0,  NULL },
 #if 0
 	{ "req.ttlfactor",		FLOAT, 0,   "req->ttlfactor" },
@@ -569,7 +573,7 @@
 	v->fmt = STRING;
 	asprintf(&p, "VRT_GetHdr(sp, \"%s\")", v->name + vh->len);
 	assert(p != NULL);
-	v->cname = p;
+	v->rname = p;
 	return (v);
 }
 
@@ -648,7 +652,7 @@
 		I(tl);
 		AddRef(tl, tl->t, R_ACL);
 		sbuf_printf(tl->fc, "ip_match(%s, acl_%*.*s)\n",
-		    vp->cname,
+		    vp->rname,
 		    tl->t->e - tl->t->b,
 		    tl->t->e - tl->t->b, tl->t->b);
 		NextToken(tl);
@@ -657,7 +661,7 @@
 	case T_NEQ:
 		I(tl);
 		sbuf_printf(tl->fc, "%s %*.*s ",
-		    vp->cname,
+		    vp->rname,
 		    tl->t->e - tl->t->b,
 		    tl->t->e - tl->t->b, tl->t->b);
 		NextToken(tl);
@@ -682,7 +686,7 @@
 
 	switch (tl->t->tok) {
 	case '~':
-		I(tl); sbuf_printf(tl->fc, "string_match(%s, ", vp->cname);
+		I(tl); sbuf_printf(tl->fc, "string_match(%s, ", vp->rname);
 		NextToken(tl);
 		ExpectErr(tl, CSTR);
 		sbuf_printf(tl->fc, "%*.*s)\n",
@@ -694,7 +698,7 @@
 	case T_NEQ:
 		I(tl);
 		sbuf_printf(tl->fc, "%sstrcmp(%s, ",
-		    tl->t->tok == T_EQ ? "!" : "", vp->cname);
+		    tl->t->tok == T_EQ ? "!" : "", vp->rname);
 		NextToken(tl);
 		ExpectErr(tl, CSTR);
 		sbuf_printf(tl->fc, "%*.*s)\n",
@@ -703,7 +707,7 @@
 		NextToken(tl);
 		break;
 	default:
-		I(tl); sbuf_printf(tl->fc, "%s != (void*)0", vp->cname);
+		I(tl); sbuf_printf(tl->fc, "%s != (void*)0", vp->rname);
 		break;
 	}
 }
@@ -713,7 +717,7 @@
 {
 
 	I(tl);
-	sbuf_printf(tl->fc, "%s ", vp->cname);
+	sbuf_printf(tl->fc, "%s ", vp->rname);
 	switch (tl->t->tok) {
 	case T_EQ:
 	case T_NEQ:
@@ -764,7 +768,7 @@
 {
 
 	I(tl);
-	sbuf_printf(tl->fc, "%s\n", vp->cname);
+	sbuf_printf(tl->fc, "%s\n", vp->rname);
 }
 
 static void
@@ -921,19 +925,13 @@
 		sbuf_printf(tl->fc, "VCL_no_cache(sp);\n");
 		return;
 	case T_DELIVER:
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Deliver);\n");
-		return;
 	case T_LOOKUP:
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Lookup);\n");
-		return;
 	case T_PASS:
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Pass);\n");
-		return;
 	case T_FETCH:
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Fetch);\n");
-		return;
 	case T_INSERT:
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Insert);\n");
+		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, VRT_H_%*.*s);\n",
+		    at->e - at->b,
+		    at->e - at->b, at->b);
 		return;
 	case T_ERROR:
 		if (tl->t->tok == CNUM)
@@ -949,7 +947,7 @@
 			NextToken(tl);
 		} else
 			sbuf_printf(tl->fc, "(const char *)0);\n");
-		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, HND_Error);\n");
+		I(tl); sbuf_printf(tl->fc, "VRT_done(sp, VRT_H_error);\n");
 		return;
 	case T_SWITCH_CONFIG:
 		ExpectErr(tl, ID);
@@ -988,7 +986,7 @@
 		ERRCHK(tl);
 		assert(vp != NULL);
 		I(tl);
-		sbuf_printf(tl->fc, "%s ", vp->cname);
+		sbuf_printf(tl->fc, "%s ", vp->rname);
 		NextToken(tl);
 		switch (vp->fmt) {
 		case INT:
@@ -1186,20 +1184,22 @@
 	t_be = tl->t;
 	AddDef(tl, tl->t, R_BACKEND);
 	I(tl);
-	sbuf_printf(tl->fh, "static struct backend VGC_backend_%*.*s;\n",
+	sbuf_printf(tl->fh,
+	    "#define VGC_backend_%*.*s (VCL_conf.backend[%d])\n",
 	    tl->t->e - tl->t->b,
-	    tl->t->e - tl->t->b, tl->t->b);
-	sbuf_printf(tl->fc, "static struct backend VGC_backend_%*.*s;\n",
+	    tl->t->e - tl->t->b, tl->t->b, tl->nbackend);
+	sbuf_printf(tl->fc, "static void\n");
+	I(tl); sbuf_printf(tl->fc,
+	    "VGC_init_backend_%*.*s (void)\n",
 	    tl->t->e - tl->t->b,
 	    tl->t->e - tl->t->b, tl->t->b);
-	sbuf_printf(tl->fc, "static void\n");
 	I(tl);
-	sbuf_printf(tl->fc,
-	    "VGC_init_backend_%*.*s (struct backend *backend)\n",
+	sbuf_printf(tl->fc, "{\n");
+	I(tl); sbuf_printf(tl->fc,
+	    "\tstruct backend *backend = VGC_backend_%*.*s;\n",
 	    tl->t->e - tl->t->b,
 	    tl->t->e - tl->t->b, tl->t->b);
-	I(tl);
-	sbuf_printf(tl->fc, "{\n");
+	I(tl); sbuf_printf(tl->fc, "\tconst char *p;\n");
 	NextToken(tl);
 	ExpectErr(tl, '{');
 	NextToken(tl);
@@ -1220,21 +1220,24 @@
 			ExpectErr(tl, CSTR);
 			t_host = tl->t;
 			host = EncString(tl->t);
-			I(tl);
-			sbuf_printf(tl->fc, "\t%s = %*.*s;\n",
-			    vp->cname,
+			I(tl); sbuf_printf(tl->fc, "\tp = %*.*s;\n",
 			    tl->t->e - tl->t->b,
 			    tl->t->e - tl->t->b, tl->t->b);
+			I(tl); sbuf_printf(tl->fc, "\t");
+			sbuf_printf(tl->fc, vp->lname, "p");
+			sbuf_printf(tl->fc, ";\n");
 			NextToken(tl);
 			break;
 		case PORTNAME:
 			ExpectErr(tl, CSTR);
 			t_port = tl->t;
 			port = EncString(tl->t);
-			sbuf_printf(tl->fc, "\t%s = %*.*s;\n",
-			    vp->cname,
+			I(tl); sbuf_printf(tl->fc, "\tp = %*.*s;\n",
 			    tl->t->e - tl->t->b,
 			    tl->t->e - tl->t->b, tl->t->b);
+			I(tl); sbuf_printf(tl->fc, "\t");
+			sbuf_printf(tl->fc, vp->lname, "p");
+			sbuf_printf(tl->fc, ";\n");
 			NextToken(tl);
 			break;
 		default:
@@ -1279,6 +1282,7 @@
 	I(tl);
 	sbuf_printf(tl->fc, "}\n");
 	sbuf_printf(tl->fc, "\n");
+	tl->nbackend++;
 }
 
 /*--------------------------------------------------------------------*/
@@ -1549,6 +1553,9 @@
 	    "\nstatic void\n"
 	    "VGC_Init(void)\n"
 	    "{\n\n");
+
+	sbuf_printf(tl->fc,
+	    "\tVRT_alloc_backends(&VCL_conf);\n");
 	
 	TAILQ_FOREACH(r, &tl->refs, list) {
 		switch(r->type) {
@@ -1558,10 +1565,8 @@
 			break;
 		case R_BACKEND:
 			sbuf_printf(tl->fc,
-			    "\tVGC_init_backend_%*.*s(&VGC_backend_%*.*s);\n",
+			    "\tVGC_init_backend_%*.*s();\n",
 			    r->name->e - r->name->b,
-			    r->name->e - r->name->b, r->name->b,
-			    r->name->e - r->name->b,
 			    r->name->e - r->name->b, r->name->b);
 			break;
 		}
@@ -1585,7 +1590,7 @@
 	sbuf_printf(tl->fc, "\t.miss_func = VGC_function_vcl_miss,\n");
 	sbuf_printf(tl->fc, "\t.fetch_func = VGC_function_vcl_fetch,\n");
 	sbuf_printf(tl->fc,
-	    "\t.default_backend = &VGC_backend_default,\n");
+	    "\t.nbackend = %d,\n", tl->nbackend);
 	sbuf_printf(tl->fc,
 	    "\t.ref = VGC_ref,\n");
 	sbuf_printf(tl->fc,
@@ -1616,6 +1621,8 @@
 	tokens.fh = sbuf_new(NULL, NULL, 0, SBUF_AUTOEXTEND);
 	assert(tokens.fh != NULL);
 
+	sbuf_printf(tokens.fc, "extern struct VCL_conf VCL_conf;\n");
+
 	tokens.b = b;
 	if (e == NULL)
 		e = strchr(b, '\0');

Modified: trunk/varnish-cache/lib/libvcl/vcl_fixed_token.c
===================================================================
--- trunk/varnish-cache/lib/libvcl/vcl_fixed_token.c	2006-06-20 09:41:43 UTC (rev 210)
+++ trunk/varnish-cache/lib/libvcl/vcl_fixed_token.c	2006-06-20 10:31:50 UTC (rev 211)
@@ -404,80 +404,8 @@
 	fputs(" * XXX: *MUST* be rerun.\n", f);
 	fputs(" */\n", f);
 	fputs("\n", f);
-	fputs("/* XXX: This include is bad.  The VCL compiler shouldn't know about it. */\n", f);
-	fputs("#include <sys/queue.h>\n", f);
-	fputs("\n", f);
 	fputs("struct sess;\n", f);
-	fputs("typedef void sesscb_f(struct sess *sp);\n", f);
 	fputs("\n", f);
-	fputs("#define VCA_ADDRBUFSIZE		32\n", f);
-	fputs("\n", f);
-	fputs("struct object {	\n", f);
-	fputs("	unsigned char		hash[16];\n", f);
-	fputs("	unsigned 		refcnt;\n", f);
-	fputs("	unsigned		valid;\n", f);
-	fputs("	unsigned		cacheable;\n", f);
-	fputs("\n", f);
-	fputs("	unsigned		busy;\n", f);
-	fputs("	unsigned		len;\n", f);
-	fputs("\n", f);
-	fputs("	char			*header;\n", f);
-	fputs("\n", f);
-	fputs("	TAILQ_HEAD(, storage)	store;\n", f);
-	fputs("};\n", f);
-	fputs("enum handling {\n", f);
-	fputs("	HND_Error	= (1 << 0),\n", f);
-	fputs("	HND_Pipe	= (1 << 1),\n", f);
-	fputs("	HND_Pass	= (1 << 2),\n", f);
-	fputs("	HND_Lookup	= (1 << 3),\n", f);
-	fputs("	HND_Fetch	= (1 << 4),\n", f);
-	fputs("	HND_Insert	= (1 << 5),\n", f);
-	fputs("	HND_Deliver	= (1 << 6),\n", f);
-	fputs("};\n", f);
-	fputs("\n", f);
-	fputs("struct sess {\n", f);
-	fputs("	int			fd;\n", f);
-	fputs("\n", f);
-	fputs("	/* formatted ascii client address */\n", f);
-	fputs("	char			addr[VCA_ADDRBUFSIZE];\n", f);
-	fputs("\n", f);
-	fputs("	/* HTTP request */\n", f);
-	fputs("	struct http		*http;\n", f);
-	fputs("\n", f);
-	fputs("	enum handling		handling;\n", f);
-	fputs("\n", f);
-	fputs("	TAILQ_ENTRY(sess)	list;\n", f);
-	fputs("\n", f);
-	fputs("	sesscb_f		*sesscb;\n", f);
-	fputs("\n", f);
-	fputs("	struct backend		*backend;\n", f);
-	fputs("	struct object		*obj;\n", f);
-	fputs("	struct VCL_conf		*vcl;\n", f);
-	fputs("\n", f);
-	fputs("	/* Various internal stuff */\n", f);
-	fputs("	struct event		*rd_e;\n", f);
-	fputs("	struct sessmem		*mem;\n", f);
-	fputs("};\n", f);
-	fputs("\n", f);
-	fputs("struct backend {\n", f);
-	fputs("	const char	*hostname;\n", f);
-	fputs("	const char	*portname;\n", f);
-	fputs("	struct addrinfo	*addr;\n", f);
-	fputs("	unsigned	ip;\n", f);
-	fputs("	double		responsetime;\n", f);
-	fputs("	double		timeout;\n", f);
-	fputs("	double		bandwidth;\n", f);
-	fputs("	int		down;\n", f);
-	fputs("\n", f);
-	fputs("	/* internal stuff */\n", f);
-	fputs("	struct vbe	*vbe;\n", f);
-	fputs("};\n", f);
-	fputs("\n", f);
-	fputs("#if 0\n", f);
-	fputs("int ip_match(unsigned, struct vcl_acl *);\n", f);
-	fputs("int string_match(const char *, const char *);\n", f);
-	fputs("#endif\n", f);
-	fputs("\n", f);
 	fputs("typedef void vcl_init_f(void);\n", f);
 	fputs("typedef int vcl_func_f(struct sess *sp);\n", f);
 	fputs("\n", f);
@@ -489,7 +417,8 @@
 	fputs("	vcl_func_f	*hit_func;\n", f);
 	fputs("	vcl_func_f	*miss_func;\n", f);
 	fputs("	vcl_func_f	*fetch_func;\n", f);
-	fputs("	struct backend	*default_backend;\n", f);
+	fputs("	struct backend	**backend;\n", f);
+	fputs("	unsigned	nbackend;\n", f);
 	fputs("	struct vrt_ref	*ref;\n", f);
 	fputs("	unsigned	nref;\n", f);
 	fputs("	unsigned	busy;\n", f);
@@ -502,6 +431,17 @@
 	fputs(" * XXX: *MUST* be rerun.\n", f);
 	fputs(" */\n", f);
 	fputs("\n", f);
+	fputs("#define	VRT_H_error	(1 << 0)\n", f);
+	fputs("#define	VRT_H_pipe	(1 << 1)\n", f);
+	fputs("#define	VRT_H_pass	(1 << 2)\n", f);
+	fputs("#define	VRT_H_lookup	(1 << 3)\n", f);
+	fputs("#define	VRT_H_fetch	(1 << 4)\n", f);
+	fputs("#define	VRT_H_insert	(1 << 5)\n", f);
+	fputs("#define	VRT_H_deliver	(1 << 6)\n", f);
+	fputs("\n", f);
+	fputs("struct sess;\n", f);
+	fputs("struct backend;\n", f);
+	fputs("\n", f);
 	fputs("struct vrt_ref {\n", f);
 	fputs("	unsigned	line;\n", f);
 	fputs("	unsigned	pos;\n", f);
@@ -527,8 +467,15 @@
 	fputs("\n", f);
 	fputs("char *VRT_GetHdr(struct sess *, const char *);\n", f);
 	fputs("char *VRT_GetReq(struct sess *);\n", f);
-	fputs("void VRT_handling(struct sess *sp, enum handling hand);\n", f);
+	fputs("void VRT_handling(struct sess *sp, unsigned hand);\n", f);
+	fputs("int VRT_obj_valid(struct sess *);\n", f);
+	fputs("int VRT_obj_cachable(struct sess *);\n", f);
 	fputs("\n", f);
+	fputs("void VRT_set_backend_hostname(struct backend *, const char *);\n", f);
+	fputs("void VRT_set_backend_portname(struct backend *, const char *);\n", f);
+	fputs("\n", f);
+	fputs("void VRT_alloc_backends(struct VCL_conf *cp);\n", f);
+	fputs("\n", f);
 	fputs("#define VRT_done(sp, hand)			\\\n", f);
 	fputs("	do {					\\\n", f);
 	fputs("		VRT_handling(sp, hand);		\\\n", f);




More information about the varnish-commit mailing list