[svn-commits] mmichelson: branch group/issue8824 r183332 - /team/group/issue8824/channels/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Mar 19 14:19:30 CDT 2009


Author: mmichelson
Date: Thu Mar 19 14:19:26 2009
New Revision: 183332

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183332
Log:
Some progress towards addressing Russell's comments.

Please don't look at the diff of chan_local. It is embarrassing.


Modified:
    team/group/issue8824/channels/chan_local.c
    team/group/issue8824/channels/chan_sip.c

Modified: team/group/issue8824/channels/chan_local.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/channels/chan_local.c?view=diff&rev=183332&r1=183331&r2=183332
==============================================================================
--- team/group/issue8824/channels/chan_local.c (original)
+++ team/group/issue8824/channels/chan_local.c Thu Mar 19 14:19:26 2009
@@ -536,8 +536,24 @@
 
 	if (!p)
 		return -1;
-	
-	ast_mutex_lock(&p->lock);
+
+	/* If you value your sanity, please don't look at this code */
+start_over:
+	while (ast_channel_trylock(p->chan)) {
+		ast_channel_unlock(p->owner);
+		usleep(1);
+		ast_channel_lock(p->owner);
+	}
+
+	/* p->owner and p->chan are locked now. Let's get p locked */
+	if (ast_mutex_trylock(&p->lock)) {
+		/* @#$&$@ */
+		ast_channel_unlock(p->chan);
+		ast_channel_unlock(p->owner);
+		usleep(1);
+		ast_channel_lock(p->owner);
+		goto start_over;
+	}
 
 	/*
 	 * Note that cid_num and cid_name aren't passed in the ast_channel_alloc
@@ -594,6 +610,7 @@
 		ast_set_flag(p, LOCAL_LAUNCHED_PBX);
 
 	ast_mutex_unlock(&p->lock);
+	ast_channel_unlock(p->chan);
 	return res;
 }
 

Modified: team/group/issue8824/channels/chan_sip.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/channels/chan_sip.c?view=diff&rev=183332&r1=183331&r2=183332
==============================================================================
--- team/group/issue8824/channels/chan_sip.c (original)
+++ team/group/issue8824/channels/chan_sip.c Thu Mar 19 14:19:26 2009
@@ -5096,7 +5096,9 @@
 		p->t38.jointcapability = p->t38.capability;
 		ast_debug(2, "Our T38 capability (%d), joint T38 capability (%d)\n", p->t38.capability, p->t38.jointcapability);
 
+		sip_pvt_lock(p);
 		xmitres = transmit_invite(p, SIP_INVITE, 1, 2);
+		sip_pvt_unlock(p);
 		if (xmitres == XMIT_ERROR)
 			return -1;
 		p->invitestate = INV_CALLING;
@@ -19766,7 +19768,7 @@
 			} else if (p->t38.state == T38_DISABLED) {
 				/* If this is not a re-invite or something to ignore - it's critical */
 				ast_set_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED);
-				transmit_response_with_sdp(p, "200 OK", req, (reinvite ? XMIT_RELIABLE : (req->ignore ?  XMIT_UNRELIABLE : XMIT_CRITICAL)), p->session_modify == TRUE ? FALSE:TRUE); 
+				transmit_response_with_sdp(p, "200 OK", req, (reinvite ? XMIT_RELIABLE : (req->ignore ?  XMIT_UNRELIABLE : XMIT_CRITICAL)), p->session_modify == TRUE ? FALSE : TRUE, FALSE); 
 			}
 
 			p->invitestate = INV_TERMINATED;




More information about the svn-commits mailing list