[svn-commits] irroot: branch irroot/distrotech-customers-trunk r319010 - /team/irroot/distr...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sat May 14 14:47:37 CDT 2011


Author: irroot
Date: Sat May 14 14:47:32 2011
New Revision: 319010

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=319010
Log:
Some deadlock avoidance added as deadlocks are discovered
Set the context if not set in mailbox.


Modified:
    team/irroot/distrotech-customers-trunk/channels/chan_sip.c

Modified: team/irroot/distrotech-customers-trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/distrotech-customers-trunk/channels/chan_sip.c?view=diff&rev=319010&r1=319009&r2=319010
==============================================================================
--- team/irroot/distrotech-customers-trunk/channels/chan_sip.c (original)
+++ team/irroot/distrotech-customers-trunk/channels/chan_sip.c Sat May 14 14:47:32 2011
@@ -6087,7 +6087,10 @@
 	} else
 		ast_debug(1, "Hangup call %s, SIP callid %s\n", ast->name, p->callid);
 
-	sip_pvt_lock(p);
+	while (sip_pvt_trylock(p)) {
+		CHANNEL_DEADLOCK_AVOIDANCE(ast);
+	}
+
 	if (ast_test_flag(&p->flags[0], SIP_INC_COUNT) || ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
 		if (sipdebug)
 			ast_debug(1, "update_call_counter(%s) - decrement call limit counter on hangup\n", p->username);
@@ -6315,7 +6318,9 @@
 			return 0;
 		}
 		if (p) {
-			sip_pvt_lock(p);
+			while (sip_pvt_trylock(p)) {
+				CHANNEL_DEADLOCK_AVOIDANCE(ast);
+			}
 			if (p->rtp) {
 				/* If channel is not up, activate early media session */
 				if ((ast->_state != AST_STATE_UP) &&
@@ -6424,7 +6429,10 @@
 	}
 	p = newchan->tech_pvt;
 
-	sip_pvt_lock(p);
+	while (sip_pvt_trylock(p)) {
+		CHANNEL_DEADLOCK_AVOIDANCE(oldchan);
+	}
+
 	append_history(p, "Masq", "Old channel: %s\n", oldchan->name);
 	append_history(p, "Masq (cont)", "...new owner: %s\n", newchan->name);
 	if (p->owner != oldchan)
@@ -6450,6 +6458,10 @@
 {
 	struct sip_pvt *p = ast->tech_pvt;
 	int res = 0;
+
+	if (!p) {
+		return res;
+	}
 
 	sip_pvt_lock(p);
 	switch (ast_test_flag(&p->flags[0], SIP_DTMF)) {
@@ -7240,7 +7252,10 @@
 	struct sip_pvt *p = ast->tech_pvt;
 	int faxdetected = FALSE;
 
-	sip_pvt_lock(p);
+	while (sip_pvt_trylock(p)) {
+		CHANNEL_DEADLOCK_AVOIDANCE(ast);
+	}
+
 	fr = sip_rtp_read(ast, p, &faxdetected);
 	p->lastrtprx = time(NULL);
 
@@ -26411,6 +26426,11 @@
 	while ((mbox = context = strsep(&next, ","))) {
 		struct sip_mailbox *mailbox;
 		int duplicate = 0;
+
+		if (strstr("@",context) == NULL) {
+			strncat(context,"@",sizeof(context)-2);
+			strncat(context,peer->context,sizeof(context)-strlen(peer->context)-1);
+		}
 
 		strsep(&context, "@");
 
@@ -28297,7 +28317,10 @@
 		return AST_RTP_GLUE_RESULT_FORBID;
 	}
 
-	sip_pvt_lock(p);
+	while (sip_pvt_trylock(p)) {
+		CHANNEL_DEADLOCK_AVOIDANCE(chan);
+	}
+
 	if (!(p->rtp)) {
 		sip_pvt_unlock(p);
 		return AST_RTP_GLUE_RESULT_FORBID;




More information about the svn-commits mailing list