#include <proto/proto_tcp.h>
#include <proto/sample.h>
#include <proto/stream.h>
+#include <proto/vars.h>
/* This contains a pool of struct vars */
static struct pool_head *var_pool = NULL;
pool_free2(var_pool, var);
size += sizeof(struct var);
}
- var_accounting_diff(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, -size);
+ var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -size);
+}
+
+/* This function frees all the memory used by all the session variables in the
+ * list starting at <vars>.
+ */
+void vars_prune_per_sess(struct vars *vars)
+{
+ struct var *var, *tmp;
+ unsigned int size = 0;
+
+ list_for_each_entry_safe(var, tmp, &vars->head, l) {
+ if (var->data.type == SMP_T_STR ||
+ var->data.type == SMP_T_BIN) {
+ free(var->data.data.str.str);
+ size += var->data.data.str.len;
+ }
+ else if (var->data.type == SMP_T_METH) {
+ free(var->data.data.meth.str.str);
+ size += var->data.data.meth.str.len;
+ }
+ LIST_DEL(&var->l);
+ pool_free2(var_pool, var);
+ size += sizeof(struct var);
+ }
+ vars->size -= size;
+ var_global_size -= size;
}
/* This function init a list of variabes. */
/* Check the availibity of the variable. */
switch (var_desc->scope) {
- case SCOPE_SESS: vars = &smp->strm->vars_sess; break;
+ case SCOPE_SESS: vars = &smp->strm->sess->vars; break;
case SCOPE_TXN: vars = &smp->strm->vars_txn; break;
case SCOPE_REQ:
case SCOPE_RES:
if (var->data.type == SMP_T_STR ||
var->data.type == SMP_T_BIN) {
free(var->data.data.str.str);
- var_accounting_diff(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, -var->data.data.str.len);
+ var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -var->data.data.str.len);
}
else if (var->data.type == SMP_T_METH) {
free(var->data.data.meth.str.str);
- var_accounting_diff(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, -var->data.data.meth.str.len);
+ var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -var->data.data.meth.str.len);
}
} else {
/* Check memory avalaible. */
- if (!var_accounting_add(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, sizeof(struct var)))
+ if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, sizeof(struct var)))
return 0;
/* Create new entry. */
break;
case SMP_T_STR:
case SMP_T_BIN:
- if (!var_accounting_add(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, smp->data.str.len)) {
+ if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.str.len)) {
var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
return 0;
}
var->data.data.str.str = malloc(smp->data.str.len);
if (!var->data.data.str.str) {
- var_accounting_diff(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, -smp->data.str.len);
+ var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.str.len);
var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
return 0;
}
memcpy(var->data.data.str.str, smp->data.str.str, var->data.data.str.len);
break;
case SMP_T_METH:
- if (!var_accounting_add(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, smp->data.meth.str.len)) {
+ if (!var_accounting_add(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, smp->data.meth.str.len)) {
var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
return 0;
}
var->data.data.meth.str.str = malloc(smp->data.meth.str.len);
if (!var->data.data.meth.str.str) {
- var_accounting_diff(vars, &strm->vars_sess, &strm->vars_txn, &strm->vars_reqres, -smp->data.meth.str.len);
+ var_accounting_diff(vars, &strm->sess->vars, &strm->vars_txn, &strm->vars_reqres, -smp->data.meth.str.len);
var->data.type = SMP_T_BOOL; /* This type doesn't use additional memory. */
return 0;
}
struct vars *vars;
switch (scope) {
- case SCOPE_SESS: vars = &strm->vars_sess; break;
+ case SCOPE_SESS: vars = &strm->sess->vars; break;
case SCOPE_TXN: vars = &strm->vars_txn; break;
case SCOPE_REQ:
case SCOPE_RES:
/* Select "vars" pool according with the scope. */
switch (scope) {
- case SCOPE_SESS: vars = &strm->vars_sess; break;
+ case SCOPE_SESS: vars = &strm->sess->vars; break;
case SCOPE_TXN: vars = &strm->vars_txn; break;
case SCOPE_REQ:
case SCOPE_RES: