From 956135f9a3cbc63c3a3830bad877fe1aabad7537 Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Fri, 25 Nov 2016 17:14:40 +0100
Subject: [PATCH] T: add mechanisms to free filters

---
 common/utils/T/tracer/filter/filter.c | 31 ++++++++++++++++++++++++++-
 common/utils/T/tracer/filter/filter.h |  2 ++
 2 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/common/utils/T/tracer/filter/filter.c b/common/utils/T/tracer/filter/filter.c
index b09b01259..d26dc2500 100644
--- a/common/utils/T/tracer/filter/filter.c
+++ b/common/utils/T/tracer/filter/filter.c
@@ -13,6 +13,7 @@ struct filter {
   } v;
 
   int (*eval)(struct filter *this, event e);
+  void (*free)(struct filter *this);
 };
 
 /****************************************************************************/
@@ -52,7 +53,23 @@ int eval_evarg(struct filter *f, event e)
 }
 
 /****************************************************************************/
-/*                     filter construction functions                        */
+/*                     free memory functions                                */
+/****************************************************************************/
+
+void free_op2(struct filter *f)
+{
+  free_filter(f->v.op2.a);
+  free_filter(f->v.op2.b);
+  free(f);
+}
+
+void free_noop(struct filter *f)
+{
+  free(f);
+}
+
+/****************************************************************************/
+/*                     filter construction/destruction functions            */
 /****************************************************************************/
 
 filter *filter_and(filter *a, filter *b)
@@ -60,6 +77,7 @@ filter *filter_and(filter *a, filter *b)
   struct filter *ret = calloc(1, sizeof(struct filter));
   if (ret == NULL) abort();
   ret->eval = eval_and;
+  ret->free = free_op2;
   ret->v.op2.a = a;
   ret->v.op2.b = b;
   return ret;
@@ -70,6 +88,7 @@ filter *filter_eq(filter *a, filter *b)
   struct filter *ret = calloc(1, sizeof(struct filter));
   if (ret == NULL) abort();
   ret->eval = eval_eq;
+  ret->free = free_op2;
   ret->v.op2.a = a;
   ret->v.op2.b = b;
   return ret;
@@ -80,6 +99,7 @@ filter *filter_int(int v)
   struct filter *ret = calloc(1, sizeof(struct filter));
   if (ret == NULL) abort();
   ret->eval = eval_int;
+  ret->free = free_noop;
   ret->v.v = v;
   return ret;
 }
@@ -97,6 +117,7 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
   f = get_format(database, event_id);
 
   ret->eval = eval_evarg;
+  ret->free = free_noop;
   ret->v.evarg.event_type = event_id;
   ret->v.evarg.arg_index = -1;
 
@@ -114,6 +135,14 @@ filter *filter_evarg(void *database, char *event_name, char *varname)
   return ret;
 }
 
+void free_filter(filter *_f)
+{
+  struct filter *f;
+  if (_f == NULL) return;
+  f = _f;
+  f->free(f);
+}
+
 /****************************************************************************/
 /*                     eval function                                        */
 /****************************************************************************/
diff --git a/common/utils/T/tracer/filter/filter.h b/common/utils/T/tracer/filter/filter.h
index eba02d7fb..d45e0bdd8 100644
--- a/common/utils/T/tracer/filter/filter.h
+++ b/common/utils/T/tracer/filter/filter.h
@@ -12,4 +12,6 @@ filter *filter_evarg(void *database, char *event_name, char *varname);
 
 int filter_eval(filter *f, event e);
 
+void free_filter(filter *f);
+
 #endif /* _FILTER_H_ */
-- 
GitLab