[asterisk-commits] rmudgett: branch 1.8 r288080 - in /branches/1.8/apps: app_dial.c app_queue.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Sep 21 15:30:03 CDT 2010


Author: rmudgett
Date: Tue Sep 21 15:29:59 2010
New Revision: 288080

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=288080
Log:
Simplify locking code for REDIRECTING interception macro when forwarding a call.

Simplified the locking code by using a local copy of the redirecting party
information in app_dial.c:do_forward() and app_queue.c:wait_for_answer()
for launching the REDIRECTING interception macro when a call is forwarded.

Reduced the lock time of the 'o->chan' and 'in' channels.

Modified:
    branches/1.8/apps/app_dial.c
    branches/1.8/apps/app_queue.c

Modified: branches/1.8/apps/app_dial.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_dial.c?view=diff&rev=288080&r1=288079&r2=288080
==============================================================================
--- branches/1.8/apps/app_dial.c (original)
+++ branches/1.8/apps/app_dial.c Tue Sep 21 15:29:59 2010
@@ -852,6 +852,8 @@
 		handle_cause(cause, num);
 		ast_hangup(original);
 	} else {
+		struct ast_party_redirecting redirecting;
+
 		if (single && CAN_EARLY_BRIDGE(peerflags, c, in)) {
 			ast_rtp_instance_early_bridge_make_compatible(c, in);
 		}
@@ -895,21 +897,19 @@
 		 * deadlock. This is why the handling of c's lock may seem a bit unusual
 		 * here.
 		 */
+		ast_party_redirecting_init(&redirecting);
+		ast_party_redirecting_copy(&redirecting, &c->redirecting);
 		ast_channel_unlock(c);
-		if (ast_channel_redirecting_macro(c, in, &c->redirecting, 1, 0)) {
-			while (ast_channel_trylock(c)) {
-				CHANNEL_DEADLOCK_AVOIDANCE(in);
-			}
-			ast_channel_update_redirecting(in, &c->redirecting, NULL);
-			ast_channel_unlock(c);
-		}
+		if (ast_channel_redirecting_macro(c, in, &redirecting, 1, 0)) {
+			ast_channel_update_redirecting(in, &redirecting, NULL);
+		}
+		ast_party_redirecting_free(&redirecting);
+		ast_channel_unlock(in);
 
 		ast_clear_flag64(peerflags, OPT_IGNORE_CONNECTEDLINE);
 		if (ast_test_flag64(peerflags, OPT_CANCEL_TIMEOUT)) {
 			*to = -1;
 		}
-
-		ast_channel_unlock(in);
 
 		if (ast_call(c, stuff, 0)) {
 			ast_log(LOG_NOTICE, "Forwarding failed to dial '%s/%s'\n",

Modified: branches/1.8/apps/app_queue.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/apps/app_queue.c?view=diff&rev=288080&r1=288079&r2=288080
==============================================================================
--- branches/1.8/apps/app_queue.c (original)
+++ branches/1.8/apps/app_queue.c Tue Sep 21 15:29:59 2010
@@ -3414,6 +3414,8 @@
 						o->stillgoing = 0;
 						numnochan++;
 					} else {
+						struct ast_party_redirecting redirecting;
+
 						ast_channel_lock(o->chan);
 						while (ast_channel_trylock(in)) {
 							CHANNEL_DEADLOCK_AVOIDANCE(o->chan);
@@ -3449,27 +3451,24 @@
 						 * deadlock.  This is why the handling of o->chan's lock may
 						 * seem a bit unusual here.
 						 */
+						ast_party_redirecting_init(&redirecting);
+						ast_party_redirecting_copy(&redirecting, &o->chan->redirecting);
 						ast_channel_unlock(o->chan);
-						res = ast_channel_redirecting_macro(o->chan, in, &o->chan->redirecting, 1, 0);
-						while (ast_channel_trylock(o->chan)) {
-							CHANNEL_DEADLOCK_AVOIDANCE(in);
+						res = ast_channel_redirecting_macro(o->chan, in, &redirecting, 1, 0);
+						if (res) {
+							ast_channel_update_redirecting(in, &redirecting, NULL);
 						}
-						if (res) {
-							ast_channel_update_redirecting(in, &o->chan->redirecting, NULL);
-						}
+						ast_party_redirecting_free(&redirecting);
+						ast_channel_unlock(in);
 
 						update_connectedline = 1;
 
 						if (ast_call(o->chan, stuff, 0)) {
 							ast_log(LOG_NOTICE, "Forwarding failed to dial '%s/%s'\n",
 								tech, stuff);
-							ast_channel_unlock(o->chan);
 							do_hang(o);
 							numnochan++;
-						} else {
-							ast_channel_unlock(o->chan);
 						}
-						ast_channel_unlock(in);
 					}
 					/* Hangup the original channel now, in case we needed it */
 					ast_hangup(winner);




More information about the asterisk-commits mailing list