diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-01-15 00:24:59 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2016-01-23 22:34:17 +0200 |
commit | b946286617a36e74b5ee6efd09930ed18683afd7 (patch) | |
tree | fa7d72320520bc9b0681c3058f8b2777d49f190b /src/variable.c | |
parent | c90ba2a863a446b51b9ee960cead69a4b2884045 (diff) | |
download | vmod-variable-b946286617a36e74b5ee6efd09930ed18683afd7.tar.gz vmod-variable-b946286617a36e74b5ee6efd09930ed18683afd7.tar.bz2 |
Store per-session symtabs in private storage. Drop v.3 support.
* src/variable.c (symtabv, symtabc)
(symtab_mtx): Remove globals.
(get_symtab): Save symtab in private data pointer.
(vmod_clear, vmod_get_string)
(vmod_set_string, vmod_get, vmod_set)
(DEFGET, DEFSET)
(vmod_defined, vmod_type_of)
(vmod_unset, vmod_regset)
(vmod_queryset): Expect struct vmod_priv * as 2nd argument.
* src/variable.vcc: Change prototypes.
* NEWS: Version 1.0.90
* configure.ac: Update.
Diffstat (limited to 'src/variable.c')
-rw-r--r-- | src/variable.c | 108 |
1 files changed, 46 insertions, 62 deletions
diff --git a/src/variable.c b/src/variable.c index e6bad1a..d9030a3 100644 --- a/src/variable.c +++ b/src/variable.c @@ -18,25 +18,16 @@ #include <stdlib.h> #include <stdarg.h> #include <syslog.h> +#include <errno.h> #include <ctype.h> #include <pcre.h> #include "vrt.h" #include "vcc_if.h" #include "pthread.h" -#if VARNISHVERSION == 3 -# include "bin/varnishd/cache.h" -# define VCL_VOID void -# define VCL_STRING const char * -# define VCL_REAL double -# define VCL_DURATION double -# define WS_Copy(w,s,l) WS_Dup(w,s) -# define VARIABLE_CTX struct sess * -# define WSPTR(s) ((s)->wrk->ws) -#else -# include "bin/varnishd/cache/cache.h" -# define VARIABLE_CTX const struct vrt_ctx * -# define WSPTR(s) ((s)->ws) -#endif + +#include "bin/varnishd/cache/cache.h" +#define VARIABLE_CTX const struct vrt_ctx * +#define WSPTR(s) ((s)->ws) /* |hash_size| defines a sequence of symbol table sizes. These are prime numbers, each of which is approximately twice its predecessor. */ @@ -310,10 +301,6 @@ symtab_free(struct symtab *st) } -static struct symtab **symtabv; -static size_t symtabc; -static pthread_mutex_t symtab_mtx = PTHREAD_MUTEX_INITIALIZER; - static struct symtab *global_symtab; static pthread_mutex_t global_mtx = PTHREAD_MUTEX_INITIALIZER; @@ -381,28 +368,20 @@ vmod_global_unset(VARIABLE_CTX ctx, VCL_STRING name) AZ(pthread_mutex_unlock(&global_mtx)); } +static void +priv_symtab_free(void *p) +{ + symtab_free(p); +} + static struct symtab * -get_symtab(VARIABLE_CTX ctx) +get_symtab(struct vmod_priv *priv) { - struct symtab *st; - int fd = ctx->req->sp->fd; - - assert(fd >= 0); - AZ(pthread_mutex_lock(&symtab_mtx)); - if (symtabc <= fd) { - size_t n = fd + 1; - symtabv = realloc(symtabv, n * sizeof(symtabv[0])); - while (symtabc < n) - symtabv[symtabc++] = NULL; + if (!priv->priv) { + priv->priv = symtab_create(); + priv->free = priv_symtab_free; } - if (!symtabv[fd]) - symtabv[fd] = symtab_create(); - st = symtabv[fd]; - if (st->vxid != ctx->req->sp->vxid) - symtab_clear(st); - st->vxid = ctx->req->sp->vxid; - AZ(pthread_mutex_unlock(&symtab_mtx)); - return st; + return priv->priv; } #define getvar(vt, name) symtab_lookup_or_install(vt, name, NULL) @@ -424,24 +403,25 @@ defvar(struct symtab *vt, const char *name, enum variable_type t, } VCL_VOID -vmod_clear(VARIABLE_CTX ctx) +vmod_clear(VARIABLE_CTX ctx, struct vmod_priv *priv) { - symtab_clear(get_symtab(ctx)); + symtab_clear(get_symtab(priv)); } VCL_STRING -vmod_get_string(VARIABLE_CTX ctx, VCL_STRING name) +vmod_get_string(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) { - struct variable *var = getvar(get_symtab(ctx), name); + struct variable *var = getvar(get_symtab(priv), name); if (var && var->type == variable_string) return var->v.s; return NULL; } VCL_VOID -vmod_set_string(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value) +vmod_set_string(VARIABLE_CTX ctx, struct vmod_priv *priv, + VCL_STRING name, VCL_STRING value) { - struct symtab *vt = get_symtab(ctx); + struct symtab *vt = get_symtab(priv); struct variable *var = defvar(vt, name, variable_unset, NULL); var->type = variable_string; var->v.s = strdup(value ? value : ""); @@ -449,23 +429,25 @@ vmod_set_string(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value) } VCL_STRING -vmod_get(VARIABLE_CTX ctx, VCL_STRING name) +vmod_get(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) { - return vmod_get_string(ctx, name); + return vmod_get_string(ctx, priv, name); } VCL_VOID -vmod_set(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value) +vmod_set(VARIABLE_CTX ctx, struct vmod_priv *priv, + VCL_STRING name, VCL_STRING value) { - vmod_set_string(ctx, name, value); + vmod_set_string(ctx, priv, name, value); } #define __cat__(a,b) a ## b #define DEFGET(r_type, vcl_type, memb) \ vcl_type \ -__cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, VCL_STRING name) \ +__cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, struct vmod_priv *priv, \ + VCL_STRING name) \ { \ - struct variable *var = getvar(get_symtab(ctx), name); \ + struct variable *var = getvar(get_symtab(priv), name); \ if (var && var->type == __cat__(variable_,r_type)) \ return var->v.memb; \ return 0; \ @@ -473,10 +455,11 @@ __cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, VCL_STRING name) \ #define DEFSET(r_type, vcl_type, memb) \ VCL_VOID \ -__cat__(vmod_set_,r_type)(VARIABLE_CTX ctx, VCL_STRING name, \ +__cat__(vmod_set_,r_type)(VARIABLE_CTX ctx, struct vmod_priv *priv, \ + VCL_STRING name, \ vcl_type value) \ { \ - struct symtab *vt = get_symtab(ctx); \ + struct symtab *vt = get_symtab(priv); \ struct variable *var = defvar(vt, name, variable_unset, NULL); \ var->type = __cat__(variable_,r_type); \ var->v.memb = value; \ @@ -491,22 +474,22 @@ DEF(real, VCL_REAL, r) DEF(duration, VCL_DURATION, d) VCL_BOOL -vmod_defined(VARIABLE_CTX ctx, VCL_STRING name) +vmod_defined(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) { - return !!getvar(get_symtab(ctx), name); + return !!getvar(get_symtab(priv), name); } VCL_STRING -vmod_type_of(VARIABLE_CTX ctx, VCL_STRING name) +vmod_type_of(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) { - struct variable *var = getvar(get_symtab(ctx), name); + struct variable *var = getvar(get_symtab(priv), name); return typestr[var ? var->type : variable_unset]; } VCL_VOID -vmod_unset(VARIABLE_CTX ctx, VCL_STRING name) +vmod_unset(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) { - symtab_remove(get_symtab(ctx), name); + symtab_remove(get_symtab(priv), name); } static void @@ -718,10 +701,10 @@ setval(union value *val, const char *s, enum variable_type type, char **err) } VCL_VOID -vmod_regset(VARIABLE_CTX ctx, VCL_STRING vars, VCL_STRING rxs, - VCL_STRING input) +vmod_regset(VARIABLE_CTX ctx, struct vmod_priv *priv, + VCL_STRING vars, VCL_STRING rxs, VCL_STRING input) { - struct symtab *vt = get_symtab(ctx); + struct symtab *vt = get_symtab(priv); struct vardef *head = NULL, *tail = NULL, *def; size_t count = 0; size_t n; @@ -894,9 +877,10 @@ define_param(struct symtab *vt, struct vardef *def, } VCL_VOID -vmod_queryset(VARIABLE_CTX ctx, VCL_STRING vars, VCL_STRING query) +vmod_queryset(VARIABLE_CTX ctx, struct vmod_priv *priv, + VCL_STRING vars, VCL_STRING query) { - struct symtab *vt = get_symtab(ctx); + struct symtab *vt = get_symtab(priv); struct vardef *head = NULL, *tail = NULL, *def; size_t count = 0; const char *v = vars; |