[asterisk-commits] dvossel: trunk r283383 - in /trunk: ./ channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Aug 24 11:12:39 CDT 2010


Author: dvossel
Date: Tue Aug 24 11:12:36 2010
New Revision: 283383

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=283383
Log:
Merged revisions 283382 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/1.8

................
  r283382 | dvossel | 2010-08-24 11:11:18 -0500 (Tue, 24 Aug 2010) | 25 lines
  
  Merged revisions 283381 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.6.2
  
  ................
    r283381 | dvossel | 2010-08-24 11:07:37 -0500 (Tue, 24 Aug 2010) | 18 lines
    
    Merged revisions 283380 via svnmerge from 
    https://origsvn.digium.com/svn/asterisk/branches/1.4
    
    ........
      r283380 | dvossel | 2010-08-24 11:01:51 -0500 (Tue, 24 Aug 2010) | 11 lines
      
      This fix makes sure the ast_channel hangs up correctly when the dialog's PENDING_BYE flag is set.
      
      When the pending bye flag is used, it is possible that the dialog will terminate
      and leave the sip_pvt->owner channel up.  This is because we never hangup the
      ast_channel after sending the SIP_BYE request.  When we receive the response for
      the SIP_BYE we set need_destroy which we would expect to destroy the dialog on the
      next do_monitor loop, but this is not the case.  The dialog will only be destroyed
      once the owner is hungup even with the need_destroy flag set.  This patch sets the
      softhangup flag on the ast_channel when a SIP_BYE request is sent as a result of the
      pending bye flag.
    ........
  ................
................

Modified:
    trunk/   (props changed)
    trunk/channels/chan_sip.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-1.8-merged' - no diff available.

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=283383&r1=283382&r2=283383
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Tue Aug 24 11:12:36 2010
@@ -18500,7 +18500,11 @@
 	}
 }
 
-/*! \brief Check pending actions on SIP call */
+/*! \brief Check pending actions on SIP call 
+ *
+ * \note both sip_pvt and sip_pvt's owner channel (if present)
+ *  must be locked for this function.
+ */
 static void check_pendings(struct sip_pvt *p)
 {
 	if (ast_test_flag(&p->flags[0], SIP_PENDINGBYE)) {
@@ -18515,6 +18519,9 @@
 			if (p->pendinginvite)
 				return;
 
+			if (p->owner) {
+				ast_softhangup_nolock(p->owner, AST_SOFTHANGUP_DEV);
+			}
 			/* Perhaps there is an SD change INVITE outstanding */
 			transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, TRUE);
 		}
@@ -18540,12 +18547,21 @@
 static int sip_reinvite_retry(const void *data)
 {
 	struct sip_pvt *p = (struct sip_pvt *) data;
+	struct ast_channel *owner;
 
 	sip_pvt_lock(p); /* called from schedule thread which requires a lock */
+	while ((owner = p->owner) && ast_channel_trylock(owner)) {
+		sip_pvt_unlock(p);
+		usleep(1);
+		sip_pvt_lock(p);
+	}
 	ast_set_flag(&p->flags[0], SIP_NEEDREINVITE);
 	p->waitid = -1;
 	check_pendings(p);
 	sip_pvt_unlock(p);
+	if (owner) {
+		ast_channel_unlock(owner);
+	}
 	dialog_unref(p, "unref the dialog ptr from sip_reinvite_retry, because it held a dialog ptr");
 	return 0;
 }




More information about the asterisk-commits mailing list