Module: sip-router
Branch: master
Commit: 2b2f4954554edaa7797a3e29da056b80393ec5dd
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=2b2f495…
Author: Daniel-Constantin Mierla <miconda(a)gmail.com>
Committer: Daniel-Constantin Mierla <miconda(a)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);