Module: sip-router Branch: master Commit: 13bbe5ef4575cb9018bea5b1d6871214ab7287d1 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=13bbe5ef...
Author: Vicente Hernando vhernando@systemonenoc.com Committer: Vicente Hernando vhernando@systemonenoc.com Date: Tue Jun 19 05:56:24 2012 -0400
ndb_redis: redis_free function.
- Free an unused ndb_redis reply, including also its inner rplRedis structure.
---
modules/ndb_redis/doc/ndb_redis.xml | 9 ++++++ modules/ndb_redis/doc/ndb_redis_admin.xml | 27 +++++++++++++++++ modules/ndb_redis/ndb_redis_mod.c | 24 +++++++++++++++- modules/ndb_redis/redis_client.c | 44 +++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 1 deletions(-)
diff --git a/modules/ndb_redis/doc/ndb_redis.xml b/modules/ndb_redis/doc/ndb_redis.xml index f9caa15..cd1d752 100644 --- a/modules/ndb_redis/doc/ndb_redis.xml +++ b/modules/ndb_redis/doc/ndb_redis.xml @@ -23,11 +23,20 @@ <surname>Mierla</surname> <email>miconda@gmail.com</email> </editor> + <author> + <firstname>Vicente</firstname> + <surname>Hernando</surname> + <email>vhernando@systemonenoc.com</email> + </author> </authorgroup> <copyright> <year>2011</year> <holder>asipto.com</holder> </copyright> + <copyright> + <year>2012</year> + <holder>www.systemonenoc.com</holder> + </copyright> </bookinfo> <toc></toc>
diff --git a/modules/ndb_redis/doc/ndb_redis_admin.xml b/modules/ndb_redis/doc/ndb_redis_admin.xml index 1b4aa18..11345c5 100644 --- a/modules/ndb_redis/doc/ndb_redis_admin.xml +++ b/modules/ndb_redis/doc/ndb_redis_admin.xml @@ -158,6 +158,33 @@ if(redis_cmd("srvN", "HMGET foo_key field1 field3", "r")) { </programlisting> </example> </section> + <section> + <title> + <function moreinfo="none">redis_free(replyid)</function> + </title> + <para> + Free a previous reply from memory. + After this function call, accessing to a freed replyid returns null value. + </para> + <para> + It is not necessary to free a reply to use it again in a new redis_cmd + function. When ndb_redis module closes, all pending replies are freed + automatically, so you only need to use this function if you perform a + lot of redis command requests with different replyid. + </para> + <example> + <title><function>redis_free</function> usage</title> + <programlisting format="linespecific"> +... +After a redis command call: + redis_cmd("srvN", "INCR cnt", "r"); + +when reply not used anymore: + redis_free("r"); +... + </programlisting> + </example> + </section> </section> </chapter>
diff --git a/modules/ndb_redis/ndb_redis_mod.c b/modules/ndb_redis/ndb_redis_mod.c index d91626c..c1f2b13 100644 --- a/modules/ndb_redis/ndb_redis_mod.c +++ b/modules/ndb_redis/ndb_redis_mod.c @@ -52,6 +52,8 @@ static int w_redis_cmd6(struct sip_msg* msg, char* ssrv, char* scmd, char *sargv1, char *sargv2, char *sargv3, char* sres); static int fixup_redis_cmd6(void** param, int param_no);
+static int w_redis_free_reply(struct sip_msg* msg, char* res); + static int mod_init(void); static void mod_destroy(void); static int child_init(int rank); @@ -76,6 +78,8 @@ static cmd_export_t cmds[]={ 0, ANY_ROUTE}, {"redis_cmd", (cmd_function)w_redis_cmd6, 6, fixup_redis_cmd6, 0, ANY_ROUTE}, + {"redis_free", (cmd_function)w_redis_free_reply, 1, fixup_spve_null, + 0, ANY_ROUTE}, {0, 0, 0, 0, 0, 0} };
@@ -291,12 +295,30 @@ static int fixup_redis_cmd6(void** param, int param_no) /** * */ +static int w_redis_free_reply(struct sip_msg* msg, char* res) +{ + str name; + + if(fixup_get_svalue(msg, (gparam_t*)res, &name)!=0) + { + LM_ERR("no redis reply name\n"); + return -1; + } + + if(redisc_free_reply(&name)<0) + return -1; + + return 1; +} + +/** + * + */ int redis_srv_param(modparam_t type, void *val) { return redisc_add_server((char*)val); }
- /** * */ diff --git a/modules/ndb_redis/redis_client.c b/modules/ndb_redis/redis_client.c index 9066fda..34d2314 100644 --- a/modules/ndb_redis/redis_client.c +++ b/modules/ndb_redis/redis_client.c @@ -364,3 +364,47 @@ redisc_reply_t *redisc_get_reply(str *name) _redisc_rpl_list = rpl; return rpl; } + + +/** + * + */ +int redisc_free_reply(str *name) +{ + redisc_reply_t *rpl, *prev_rpl, *next_rpl; + unsigned int hid; + + hid = get_hash1_raw(name->s, name->len); + + prev_rpl = NULL; + rpl = _redisc_rpl_list; + while(rpl) { + + if(rpl->hname==hid && rpl->rname.len==name->len + && strncmp(rpl->rname.s, name->s, name->len)==0) { + next_rpl = rpl->next; + if(rpl->rplRedis) + freeReplyObject(rpl->rplRedis); + + if(rpl->rname.s != NULL) + pkg_free(rpl->rname.s); + + pkg_free(rpl); + + if(prev_rpl==NULL) { + /* We delete first element in the list. */ + _redisc_rpl_list = next_rpl; + } else { + prev_rpl->next = next_rpl; + } + + return 0; + } + + prev_rpl = rpl; + rpl = rpl->next; + } + + /* reply entry not found. */ + return -1; +}