Module: sip-router Branch: master Commit: 2b2f4954554edaa7797a3e29da056b80393ec5dd URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2b2f4954...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Thu Jul 15 14:02:46 2010 +0200
core: added pv name free function
- some PVs have dynamic name, therefore parsing them at runtime result in memory leak - the new attribute allow to free such kind of names - not the case so far with stable versions but this can happen when using such PVs with app_lua
---
pvapi.c | 17 ++++++++++++++--- pvar.h | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-)
diff --git a/pvapi.c b/pvapi.c index bbd4b87..baeddab 100644 --- a/pvapi.c +++ b/pvapi.c @@ -1148,14 +1148,25 @@ error: }
/** - * + * destroy the content of pv_spec_t structure */ -void pv_spec_free(pv_spec_t *spec) +void pv_spec_destroy(pv_spec_t *spec) { if(spec==0) return; - /* TODO: free name if it is PV */ + /* free name if it is PV */ + if(spec->pvp.pvn.nfree) + spec->pvp.pvn.nfree((void*)(&spec->pvp.pvn)); if(spec->trans) tr_free((trans_t*)spec->trans); +} + +/** + * free the pv_spec_t structure + */ +void pv_spec_free(pv_spec_t *spec) +{ + if(spec==0) return; + pv_spec_destroy(spec); pkg_free(spec); }
diff --git a/pvar.h b/pvar.h index 58fe38b..e7701f2 100644 --- a/pvar.h +++ b/pvar.h @@ -84,6 +84,7 @@ enum _pv_type { typedef enum _pv_type pv_type_t; typedef int pv_flags_t;
+typedef void (*pv_name_free_f)(void*);
typedef struct _pv_value { @@ -95,6 +96,7 @@ typedef struct _pv_value typedef struct _pv_name { int type; /*!< type of name */ + pv_name_free_f nfree; /*!< function to free name structure */ union { struct { int type; /*!< type of int_str name - compatibility with AVPs */ @@ -174,6 +176,7 @@ int pv_set_spec_value(struct sip_msg* msg, pv_spec_p sp, int op, int pv_printf(struct sip_msg* msg, pv_elem_p list, char *buf, int *len); int pv_elem_free_all(pv_elem_p log); void pv_value_destroy(pv_value_t *val); +void pv_spec_destroy(pv_spec_t *spec); void pv_spec_free(pv_spec_t *spec); int pv_spec_dbg(pv_spec_p sp); int pv_get_spec_index(struct sip_msg* msg, pv_param_p ip, int *idx, int *flags);