From 69010fa326eedaf1606ea2ab939cf1951d19c46e Mon Sep 17 00:00:00 2001 From: phk Date: Tue, 20 Jun 2006 09:15:39 +0000 Subject: [PATCH] Start putting some structure in the sources relating to VCL handling: Split the runtime support for compiled varnish programs out and give it the prefix "VRT". Start using the prefix "VGC" for generated code. Prefix "VCC" will be for the compiler and "VCL" for calling the compiled and loaded functions. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@207 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/Makefile.am | 1 + varnish-cache/bin/varnishd/cache_vcl.c | 43 ------------ varnish-cache/bin/varnishd/cache_vrt.c | 69 +++++++++++++++++++ varnish-cache/include/vcl_lang.h | 32 +-------- varnish-cache/include/vrt.h | 40 +++++++++++ varnish-cache/lib/libvcl/vcl_compile.c | 30 ++++---- varnish-cache/lib/libvcl/vcl_fixed_token.c | 60 +++++++++------- .../lib/libvcl/vcl_gen_fixed_token.tcl | 41 ++++++----- 8 files changed, 190 insertions(+), 126 deletions(-) create mode 100644 varnish-cache/bin/varnishd/cache_vrt.c create mode 100644 varnish-cache/include/vrt.h diff --git a/varnish-cache/bin/varnishd/Makefile.am b/varnish-cache/bin/varnishd/Makefile.am index b56b34e9..23287109 100644 --- a/varnish-cache/bin/varnishd/Makefile.am +++ b/varnish-cache/bin/varnishd/Makefile.am @@ -15,6 +15,7 @@ varnishd_SOURCES = \ cache_pipe.c \ cache_shmlog.c \ cache_vcl.c \ + cache_vrt.c \ cli_event.c \ hash_simple_list.c \ mgt_child.c \ diff --git a/varnish-cache/bin/varnishd/cache_vcl.c b/varnish-cache/bin/varnishd/cache_vcl.c index a5ee57b6..4a503315 100644 --- a/varnish-cache/bin/varnishd/cache_vcl.c +++ b/varnish-cache/bin/varnishd/cache_vcl.c @@ -190,24 +190,6 @@ cli_func_config_use(struct cli *cli, char **av, void *priv) /*--------------------------------------------------------------------*/ -void -VCL_error(VCL_FARGS, unsigned err, const char *str) -{ - - VSL(SLT_Debug, 0, "VCL_error(%u, %s)", err, str); -} - -void -VCL_count(struct sess *sp, unsigned u) -{ - - VSL(SLT_VCL, 0, "%u %d.%d", u, - sp->vcl->ref[u].line, - sp->vcl->ref[u].pos); -} - -/*--------------------------------------------------------------------*/ - static const char * HandlingName(unsigned u) { @@ -261,28 +243,3 @@ VCL_method(recv, HND_Error|HND_Pass|HND_Pipe|HND_Lookup) VCL_method(miss, HND_Error|HND_Pass|HND_Pipe|HND_Fetch) VCL_method(hit, HND_Error|HND_Pass|HND_Pipe|HND_Deliver) VCL_method(fetch, HND_Error|HND_Pass|HND_Pipe|HND_Insert) - -/*--------------------------------------------------------------------*/ - -char * -VCL_GetHdr(VCL_FARGS, const char *n) -{ - char *p; - - assert(sess != NULL); - assert(sess->http != NULL); - if (!http_GetHdr(sess->http, n, &p)) - return (NULL); - return (p); -} - -char * -VCL_GetReq(VCL_FARGS) -{ - char *p; - - assert(sess != NULL); - assert(sess->http != NULL); - assert(http_GetReq(sess->http, &p)); - return (p); -} diff --git a/varnish-cache/bin/varnishd/cache_vrt.c b/varnish-cache/bin/varnishd/cache_vrt.c new file mode 100644 index 00000000..95340f1c --- /dev/null +++ b/varnish-cache/bin/varnishd/cache_vrt.c @@ -0,0 +1,69 @@ +/* + * $Id$ + * + * Runtime support for compiled VCL programs + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "cli.h" +#include "cli_priv.h" +#include "shmlog.h" +#include "vcl_lang.h" +#include "vrt.h" +#include "libvarnish.h" +#include "cache.h" + +/*--------------------------------------------------------------------*/ + +void +VRT_error(VCL_FARGS, unsigned err, const char *str) +{ + + VSL(SLT_Debug, 0, "VCL_error(%u, %s)", err, str); +} + +/*--------------------------------------------------------------------*/ + +void +VRT_count(struct sess *sp, unsigned u) +{ + + VSL(SLT_VCL, 0, "%u %d.%d", u, + sp->vcl->ref[u].line, + sp->vcl->ref[u].pos); +} + +/*--------------------------------------------------------------------*/ + +char * +VRT_GetHdr(VCL_FARGS, const char *n) +{ + char *p; + + assert(sess != NULL); + assert(sess->http != NULL); + if (!http_GetHdr(sess->http, n, &p)) + return (NULL); + return (p); +} + +/*--------------------------------------------------------------------*/ + +char * +VRT_GetReq(VCL_FARGS) +{ + char *p; + + assert(sess != NULL); + assert(sess->http != NULL); + assert(http_GetReq(sess->http, &p)); + return (p); +} diff --git a/varnish-cache/include/vcl_lang.h b/varnish-cache/include/vcl_lang.h index 6c783138..b2790c63 100644 --- a/varnish-cache/include/vcl_lang.h +++ b/varnish-cache/include/vcl_lang.h @@ -11,18 +11,6 @@ struct sess; typedef void sesscb_f(struct sess *sp); -struct vcl_ref { - unsigned line; - unsigned pos; - unsigned count; - const char *token; -}; - -struct vcl_acl { - unsigned ip; - unsigned mask; -}; - #define VCA_ADDRBUFSIZE 32 struct object { @@ -91,17 +79,10 @@ struct backend { #define VCL_FARGS struct sess *sess #define VCL_PASS_ARGS sess -void VCL_count(struct sess *, unsigned); -void VCL_no_cache(VCL_FARGS); -void VCL_no_new_cache(VCL_FARGS); +#if 0 int ip_match(unsigned, struct vcl_acl *); int string_match(const char *, const char *); -int VCL_rewrite(const char *, const char *); -void VCL_error(VCL_FARGS, unsigned, const char *); -int VCL_switch_config(const char *); - -char *VCL_GetHdr(VCL_FARGS, const char *); -char *VCL_GetReq(VCL_FARGS); +#endif typedef void vcl_init_f(void); typedef void vcl_func_f(VCL_FARGS); @@ -115,14 +96,7 @@ struct VCL_conf { vcl_func_f *miss_func; vcl_func_f *fetch_func; struct backend *default_backend; - struct vcl_ref *ref; + struct vrt_ref *ref; unsigned nref; unsigned busy; }; - -#define VCL_done(sess, hand) \ - do { \ - sess->handling = hand; \ - sess->done = 1; \ - return; \ - } while (0) diff --git a/varnish-cache/include/vrt.h b/varnish-cache/include/vrt.h new file mode 100644 index 00000000..8b978148 --- /dev/null +++ b/varnish-cache/include/vrt.h @@ -0,0 +1,40 @@ +/* $Id$ */ +/* + * Runtime support for compiled VCL programs. + * + * XXX: When this file is changed, lib/libvcl/vcl_gen_fixed_token.tcl + * XXX: *MUST* be rerun. + */ + +struct vrt_ref { + unsigned line; + unsigned pos; + unsigned count; + const char *token; +}; + +struct vrt_acl { + unsigned ip; + unsigned mask; +}; + +void VRT_count(struct sess *, unsigned); +void VRT_no_cache(VCL_FARGS); +void VRT_no_new_cache(VCL_FARGS); +#if 0 +int ip_match(unsigned, struct vcl_acl *); +int string_match(const char *, const char *); +#endif +int VRT_rewrite(const char *, const char *); +void VRT_error(VCL_FARGS, unsigned, const char *); +int VRT_switch_config(const char *); + +char *VRT_GetHdr(VCL_FARGS, const char *); +char *VRT_GetReq(VCL_FARGS); + +#define VRT_done(sess, hand) \ + do { \ + sess->handling = hand; \ + sess->done = 1; \ + return; \ + } while (0) diff --git a/varnish-cache/lib/libvcl/vcl_compile.c b/varnish-cache/lib/libvcl/vcl_compile.c index cd6406dc..d5f17aa0 100644 --- a/varnish-cache/lib/libvcl/vcl_compile.c +++ b/varnish-cache/lib/libvcl/vcl_compile.c @@ -122,7 +122,7 @@ static struct var be_vars[] = { static struct var vars[] = { - { "req.request", STRING, 0, "VCL_GetReq(VCL_PASS_ARGS)" }, + { "req.request", STRING, 0, "VRT_GetReq(VCL_PASS_ARGS)" }, { "obj.valid", BOOL, 0, "sess->obj->valid" }, { "obj.cacheable", BOOL, 0, "sess->obj->cacheable" }, { "req.http.", HEADER, 0, NULL }, @@ -272,7 +272,7 @@ _Expect(struct tokenlist *tl, unsigned tok, int line) #define C(tl, sep) do { \ I(tl); \ - sbuf_printf(tl->fc, "VCL_count(sess, %u)%s\n", ++tl->cnt, sep); \ + sbuf_printf(tl->fc, "VRT_count(sess, %u)%s\n", ++tl->cnt, sep); \ tl->t->cnt = tl->cnt; \ } while (0) @@ -567,7 +567,7 @@ HeaderVar(struct tokenlist *tl, struct token *t, struct var *vh) p[i] = '\0'; v->name = p; v->fmt = STRING; - asprintf(&p, "VCL_GetHdr(VCL_PASS_ARGS, \"%s\")", v->name + vh->len); + asprintf(&p, "VRT_GetHdr(VCL_PASS_ARGS, \"%s\")", v->name + vh->len); assert(p != NULL); v->cname = p; return (v); @@ -921,19 +921,19 @@ Action(struct tokenlist *tl) sbuf_printf(tl->fc, "VCL_no_cache(VCL_PASS_ARGS);\n"); return; case T_DELIVER: - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Deliver);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Deliver);\n"); return; case T_LOOKUP: - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Lookup);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Lookup);\n"); return; case T_PASS: - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Pass);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Pass);\n"); return; case T_FETCH: - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Fetch);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Fetch);\n"); return; case T_INSERT: - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Insert);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Insert);\n"); return; case T_ERROR: if (tl->t->tok == CNUM) @@ -941,7 +941,7 @@ Action(struct tokenlist *tl) else a = 0; I(tl); - sbuf_printf(tl->fc, "VCL_error(VCL_PASS_ARGS, %u, ", a); + sbuf_printf(tl->fc, "VRT_error(VCL_PASS_ARGS, %u, ", a); if (tl->t->tok == CSTR) { sbuf_printf(tl->fc, "%*.*s);\n", tl->t->e - tl->t->b, @@ -949,7 +949,7 @@ Action(struct tokenlist *tl) NextToken(tl); } else sbuf_printf(tl->fc, "(const char *)0);\n"); - I(tl); sbuf_printf(tl->fc, "VCL_done(sess, HND_Error);\n"); + I(tl); sbuf_printf(tl->fc, "VRT_done(sess, HND_Error);\n"); return; case T_SWITCH_CONFIG: ExpectErr(tl, ID); @@ -1508,11 +1508,11 @@ LocTable(struct tokenlist *tl) const char *p; sbuf_printf(tl->fh, - "#define VCL_NREFS %u\n", tl->cnt + 1); + "#define VGC_NREFS %u\n", tl->cnt + 1); sbuf_printf(tl->fh, - "static struct vcl_ref VCL_ref[VCL_NREFS];\n"); + "static struct vrt_ref VGC_ref[VGC_NREFS];\n"); sbuf_printf(tl->fc, - "static struct vcl_ref VCL_ref[VCL_NREFS] = {\n"); + "static struct vrt_ref VGC_ref[VGC_NREFS] = {\n"); lin = 1; pos = 0; p = tl->b; @@ -1590,9 +1590,9 @@ EmitStruct(struct tokenlist *tl) sbuf_printf(tl->fc, "\t.default_backend = &VCL_backend_default,\n"); sbuf_printf(tl->fc, - "\t.ref = VCL_ref,\n"); + "\t.ref = VGC_ref,\n"); sbuf_printf(tl->fc, - "\t.nref = VCL_NREFS,\n"); + "\t.nref = VGC_NREFS,\n"); sbuf_printf(tl->fc, "};\n"); } diff --git a/varnish-cache/lib/libvcl/vcl_fixed_token.c b/varnish-cache/lib/libvcl/vcl_fixed_token.c index 6e36bae2..fdb2e57c 100644 --- a/varnish-cache/lib/libvcl/vcl_fixed_token.c +++ b/varnish-cache/lib/libvcl/vcl_fixed_token.c @@ -410,18 +410,6 @@ vcl_output_lang_h(FILE *f) fputs("struct sess;\n", f); fputs("typedef void sesscb_f(struct sess *sp);\n", f); fputs("\n", f); - fputs("struct vcl_ref {\n", f); - fputs(" unsigned line;\n", f); - fputs(" unsigned pos;\n", f); - fputs(" unsigned count;\n", f); - fputs(" const char *token;\n", f); - fputs("};\n", f); - fputs("\n", f); - fputs("struct vcl_acl {\n", f); - fputs(" unsigned ip;\n", f); - fputs(" unsigned mask;\n", f); - fputs("};\n", f); - fputs("\n", f); fputs("#define VCA_ADDRBUFSIZE 32\n", f); fputs("\n", f); fputs("struct object { \n", f); @@ -490,17 +478,10 @@ vcl_output_lang_h(FILE *f) fputs("#define VCL_FARGS struct sess *sess\n", f); fputs("#define VCL_PASS_ARGS sess\n", f); fputs("\n", f); - fputs("void VCL_count(struct sess *, unsigned);\n", f); - fputs("void VCL_no_cache(VCL_FARGS);\n", f); - fputs("void VCL_no_new_cache(VCL_FARGS);\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("int VCL_rewrite(const char *, const char *);\n", f); - fputs("void VCL_error(VCL_FARGS, unsigned, const char *);\n", f); - fputs("int VCL_switch_config(const char *);\n", f); - fputs("\n", f); - fputs("char *VCL_GetHdr(VCL_FARGS, const char *);\n", f); - fputs("char *VCL_GetReq(VCL_FARGS);\n", f); + fputs("#endif\n", f); fputs("\n", f); fputs("typedef void vcl_init_f(void);\n", f); fputs("typedef void vcl_func_f(VCL_FARGS);\n", f); @@ -514,12 +495,45 @@ vcl_output_lang_h(FILE *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 vcl_ref *ref;\n", f); + fputs(" struct vrt_ref *ref;\n", f); fputs(" unsigned nref;\n", f); fputs(" unsigned busy;\n", f); fputs("};\n", f); + fputs("/* $Id$ */\n", f); + fputs("/*\n", f); + fputs(" * Runtime support for compiled VCL programs.\n", f); + fputs(" *\n", f); + fputs(" * XXX: When this file is changed, lib/libvcl/vcl_gen_fixed_token.tcl\n", f); + fputs(" * XXX: *MUST* be rerun.\n", f); + fputs(" */\n", f); + fputs("\n", f); + fputs("struct vrt_ref {\n", f); + fputs(" unsigned line;\n", f); + fputs(" unsigned pos;\n", f); + fputs(" unsigned count;\n", f); + fputs(" const char *token;\n", f); + fputs("};\n", f); + fputs("\n", f); + fputs("struct vrt_acl {\n", f); + fputs(" unsigned ip;\n", f); + fputs(" unsigned mask;\n", f); + fputs("};\n", f); + fputs("\n", f); + fputs("void VRT_count(struct sess *, unsigned);\n", f); + fputs("void VRT_no_cache(VCL_FARGS);\n", f); + fputs("void VRT_no_new_cache(VCL_FARGS);\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("int VRT_rewrite(const char *, const char *);\n", f); + fputs("void VRT_error(VCL_FARGS, unsigned, const char *);\n", f); + fputs("int VRT_switch_config(const char *);\n", f); + fputs("\n", f); + fputs("char *VRT_GetHdr(VCL_FARGS, const char *);\n", f); + fputs("char *VRT_GetReq(VCL_FARGS);\n", f); fputs("\n", f); - fputs("#define VCL_done(sess, hand) \\\n", f); + fputs("#define VRT_done(sess, hand) \\\n", f); fputs(" do { \\\n", f); fputs(" sess->handling = hand; \\\n", f); fputs(" sess->done = 1; \\\n", f); diff --git a/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl b/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl index 85e1b961..d345f0e8 100755 --- a/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl +++ b/varnish-cache/lib/libvcl/vcl_gen_fixed_token.tcl @@ -176,28 +176,37 @@ foreach i $tokens { } puts $fo "}" -set fi [open "../../include/vcl_lang.h"] + + +proc copy_include {n} { + global fo + + set fi [open $n] + while {[gets $fi a] >= 0} { + if {"$a" == "#include "} { + puts "FOO $a" + set fx [open "../../include/http_headers.h"] + while {[gets $fx b] >= 0} { + regsub -all {"} $b {\"} b + puts $fo "\tfputs(\"$b\\n\", f);" + } + close $fx + continue + } + regsub -all {\\} $a {\\\\} a + puts $fo "\tfputs(\"$a\\n\", f);" + } + close $fi +} puts $fo "" puts $fo "void" puts $fo "vcl_output_lang_h(FILE *f)" puts $fo "{" -while {[gets $fi a] >= 0} { - if {"$a" == "#include "} { - puts "FOO $a" - set fx [open "../../include/http_headers.h"] - while {[gets $fx b] >= 0} { - regsub -all {"} $b {\"} b - puts $fo "\tfputs(\"$b\\n\", f);" - } - close $fx - continue - } - regsub -all {\\} $a {\\\\} a - puts $fo "\tfputs(\"$a\\n\", f);" -} +copy_include ../../include/vcl_lang.h +copy_include ../../include/vrt.h + puts $fo "}" -close $fi close $foh close $fo -- 2.39.5