[sr-dev] git:master: modules_k/presence Fixed refresh_watcher function

Anca Vamanu anca.vamanu at 1and1.ro
Fri May 4 10:59:29 CEST 2012


Module: sip-router
Branch: master
Commit: ca7f45d98faea9479b86e9206c4e2923a009782a
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ca7f45d98faea9479b86e9206c4e2923a009782a

Author: Anca Vamanu <anca.vamanu at 1and1.ro>
Committer: Anca Vamanu <anca.vamanu at 1and1.ro>
Date:   Fri May  4 11:57:27 2012 +0300

modules_k/presence Fixed refresh_watcher function

---

 modules_k/presence/subscribe.c |   40 ++++++++++++++++++++++++++++------------
 1 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/modules_k/presence/subscribe.c b/modules_k/presence/subscribe.c
index add1581..ae9e442 100644
--- a/modules_k/presence/subscribe.c
+++ b/modules_k/presence/subscribe.c
@@ -2225,9 +2225,10 @@ int refresh_watcher(str* pres_uri, str* watcher_uri, str* event,
 {
 	unsigned int hash_code;
 	subs_t* s, *s_copy;
-	pres_ev_t* ev;		
+	pres_ev_t* ev;
 	struct sip_uri uri;
 	str user, domain;
+	subs_t *s_array = NULL;
 	/* refresh status in subs_htable and send notify */
 
 	ev=	contains_event(event, NULL);
@@ -2262,28 +2263,43 @@ int refresh_watcher(str* pres_uri, str* watcher_uri, str* event,
 			s->status= status;
 			if(reason)
 				s->reason= *reason;
-			
+
 			s_copy= mem_copy_subs(s, PKG_MEM_TYPE);
 			if(s_copy== NULL)
 			{
 				LM_ERR("copying subs_t\n");
 				lock_release(&subs_htable[hash_code].lock);
-				return -1;
+				goto error;
 			}
-			lock_release(&subs_htable[hash_code].lock);
+
 			s_copy->local_cseq++;
-			if(notify(s_copy, NULL, NULL, 0)< 0)
-			{
-				LM_ERR("in notify function\n");
-				pkg_free(s_copy);
-				return -1;
-			}
-			pkg_free(s_copy);
-			lock_get(&subs_htable[hash_code].lock);
+			s_copy->next= s_array;
+			s_array= s_copy;
 		}
 		s= s->next;
 	}
+	lock_release(&subs_htable[hash_code].lock);
+
+	s = s_array;
+	while (s) {
+		if(notify(s, NULL, NULL, 0)< 0) {
+			LM_ERR("Failed to send Notify\n");
+		}
+		s_copy = s;
+		s = s->next;
+		pkg_free(s_copy);
+	}
+
 	return 0;
+
+error:
+	s = s_array;
+	while (s) {
+		s_copy = s;
+		s = s->next;
+		pkg_free(s_copy);
+	}
+	return -1;
 }
 
 int get_db_subs_auth(subs_t* subs, int* found)




More information about the sr-dev mailing list