[asterisk-commits] mnicholson: branch group/newcdr r203093 - /team/group/newcdr/channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jun 24 16:33:00 CDT 2009


Author: mnicholson
Date: Wed Jun 24 16:32:55 2009
New Revision: 203093

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=203093
Log:
Added deadlock avoidance for cel events generated by chan_sip

Modified:
    team/group/newcdr/channels/chan_sip.c

Modified: team/group/newcdr/channels/chan_sip.c
URL: http://svn.asterisk.org/svn-view/asterisk/team/group/newcdr/channels/chan_sip.c?view=diff&rev=203093&r1=203092&r2=203093
==============================================================================
--- team/group/newcdr/channels/chan_sip.c (original)
+++ team/group/newcdr/channels/chan_sip.c Wed Jun 24 16:32:55 2009
@@ -20717,7 +20717,13 @@
 		/* Transfer succeeded! */
 		const char *xfersound = pbx_builtin_getvar_helper(target.chan1, "ATTENDED_TRANSFER_COMPLETE_SOUND");
 
+		while (ast_channel_trylock(target.chan1)) {
+			sip_pvt_unlock(targetcall_pvt);
+			sched_yield();
+			sip_pvt_lock(targetcall_pvt);
+		}
 		ast_cel_report_event(target.chan1, AST_CEL_ATTENDEDTRANSFER, NULL, transferer_linkedid, target.chan2);
+		ast_channel_unlock(target.chan1);
 
 		/* Tell transferer that we're done. */
 		transmit_notify_with_sipfrag(transferer, seqno, "200 OK", TRUE);
@@ -21083,8 +21089,16 @@
 		/* Success  - we have a new channel */
 		ast_debug(3, "%s transfer succeeded. Telling transferer.\n", p->refer->attendedtransfer? "Attended" : "Blind");
 
+		while (ast_channel_trylock(current.chan1)) {
+			sip_pvt_unlock(p);
+			sched_yield();
+			sip_pvt_lock(p);
+		}
+
 		/* XXX - what to we put in CEL 'extra' for attended transfers to external systems? NULL for now */
 		ast_cel_report_event(current.chan1, p->refer->attendedtransfer? AST_CEL_ATTENDEDTRANSFER : AST_CEL_BLINDTRANSFER, NULL, p->refer->attendedtransfer ? NULL : p->refer->refer_to, current.chan2);
+		ast_channel_unlock(current.chan1);
+
 		transmit_notify_with_sipfrag(p, seqno, "200 Ok", TRUE);
 		if (p->refer->localtransfer)
 			p->refer->status = REFER_200OK;




More information about the asterisk-commits mailing list