diff options
Diffstat (limited to 'src/variable.c')
-rw-r--r-- | src/variable.c | 89 |
1 files changed, 47 insertions, 42 deletions
diff --git a/src/variable.c b/src/variable.c index acdc6f6..bd79c3b 100644 --- a/src/variable.c +++ b/src/variable.c @@ -312,2 +312,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; @@ -379,16 +383,22 @@ vmod_global_unset(VARIABLE_CTX ctx, VCL_STRING name) -static void -priv_symtab_free(void *p) -{ - symtab_free(p); -} - static struct symtab * -get_symtab(struct vmod_priv *priv) -{ - if (!priv->priv) { - priv->priv = symtab_create(); - priv->free = priv_symtab_free; +get_symtab(VARIABLE_CTX ctx) +{ + struct symtab *st; + int fd = ctx->req->sp->fd; + 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; } - return priv->priv; + 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; } @@ -414,5 +424,5 @@ defvar(struct symtab *vt, const char *name, enum variable_type t, VCL_VOID -vmod_clear(VARIABLE_CTX ctx, struct vmod_priv *priv) +vmod_clear(VARIABLE_CTX ctx) { - symtab_clear(get_symtab(priv)); + symtab_clear(get_symtab(ctx)); } @@ -420,5 +430,5 @@ vmod_clear(VARIABLE_CTX ctx, struct vmod_priv *priv) VCL_STRING -vmod_get_string(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) +vmod_get_string(VARIABLE_CTX ctx, VCL_STRING name) { - struct variable *var = getvar(get_symtab(priv), name); + struct variable *var = getvar(get_symtab(ctx), name); if (var && var->type == variable_string) @@ -429,6 +439,5 @@ vmod_get_string(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) VCL_VOID -vmod_set_string(VARIABLE_CTX ctx, struct vmod_priv *priv, - VCL_STRING name, VCL_STRING value) +vmod_set_string(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value) { - struct symtab *vt = get_symtab(priv); + struct symtab *vt = get_symtab(ctx); struct variable *var = defvar(vt, name, variable_unset, NULL); @@ -440,5 +449,5 @@ vmod_set_string(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING -vmod_get(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) +vmod_get(VARIABLE_CTX ctx, VCL_STRING name) { - return vmod_get_string(ctx, priv, name); + return vmod_get_string(ctx, name); } @@ -446,6 +455,5 @@ vmod_get(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) VCL_VOID -vmod_set(VARIABLE_CTX ctx, struct vmod_priv *priv, - VCL_STRING name, VCL_STRING value) +vmod_set(VARIABLE_CTX ctx, VCL_STRING name, VCL_STRING value) { - vmod_set_string(ctx, priv, name, value); + vmod_set_string(ctx, name, value); } @@ -455,6 +463,5 @@ vmod_set(VARIABLE_CTX ctx, struct vmod_priv *priv, vcl_type \ -__cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, struct vmod_priv *priv, \ - VCL_STRING name) \ +__cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, VCL_STRING name) \ { \ - struct variable *var = getvar(get_symtab(priv), name); \ + struct variable *var = getvar(get_symtab(ctx), name); \ if (var && var->type == __cat__(variable_,r_type)) \ @@ -466,7 +473,6 @@ __cat__(vmod_get_,r_type)(VARIABLE_CTX ctx, struct vmod_priv *priv, \ VCL_VOID \ -__cat__(vmod_set_,r_type)(VARIABLE_CTX ctx, struct vmod_priv *priv, \ - VCL_STRING name, \ +__cat__(vmod_set_,r_type)(VARIABLE_CTX ctx, VCL_STRING name, \ vcl_type value) \ { \ - struct symtab *vt = get_symtab(priv); \ + struct symtab *vt = get_symtab(ctx); \ struct variable *var = defvar(vt, name, variable_unset, NULL); \ @@ -485,5 +491,5 @@ DEF(duration, VCL_DURATION, d) VCL_BOOL -vmod_defined(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) +vmod_defined(VARIABLE_CTX ctx, VCL_STRING name) { - return !!getvar(get_symtab(priv), name); + return !!getvar(get_symtab(ctx), name); } @@ -491,5 +497,5 @@ vmod_defined(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) VCL_STRING -vmod_type_of(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) +vmod_type_of(VARIABLE_CTX ctx, VCL_STRING name) { - struct variable *var = getvar(get_symtab(priv), name); + struct variable *var = getvar(get_symtab(ctx), name); return typestr[var ? var->type : variable_unset]; @@ -498,5 +504,5 @@ vmod_type_of(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) VCL_VOID -vmod_unset(VARIABLE_CTX ctx, struct vmod_priv *priv, VCL_STRING name) +vmod_unset(VARIABLE_CTX ctx, VCL_STRING name) { - symtab_remove(get_symtab(priv), name); + symtab_remove(get_symtab(ctx), name); } @@ -712,6 +718,6 @@ setval(union value *val, const char *s, enum variable_type type, char **err) VCL_VOID -vmod_regset(VARIABLE_CTX ctx, struct vmod_priv *priv, - VCL_STRING vars, VCL_STRING rxs, VCL_STRING input) +vmod_regset(VARIABLE_CTX ctx, VCL_STRING vars, VCL_STRING rxs, + VCL_STRING input) { - struct symtab *vt = get_symtab(priv); + struct symtab *vt = get_symtab(ctx); struct vardef *head = NULL, *tail = NULL, *def; @@ -889,6 +895,5 @@ define_param(struct symtab *vt, struct vardef *def, VCL_VOID -vmod_queryset(VARIABLE_CTX ctx, struct vmod_priv *priv, - VCL_STRING vars, VCL_STRING query) +vmod_queryset(VARIABLE_CTX ctx, VCL_STRING vars, VCL_STRING query) { - struct symtab *vt = get_symtab(priv); + struct symtab *vt = get_symtab(ctx); struct vardef *head = NULL, *tail = NULL, *def; |