]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Destroy RTP fds when we schedule final dialog destruction
authorTerry Wilson <twilson@digium.com>
Tue, 13 Jul 2010 17:11:37 +0000 (17:11 +0000)
committerTerry Wilson <twilson@digium.com>
Tue, 13 Jul 2010 17:11:37 +0000 (17:11 +0000)
Since we are only keeping the dialog around for retransmissions at this point
and there is no possibility that we are still handling RTP, go ahead and
destroy the RTP sessions. Keeping them alive for 32 past when they are used
is unnecessary and can lead to problems with having too many open file
descriptors, etc.

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@275998 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
channels/sip/include/dialog.h

index 750ade2780acadcbd917c51c47c29db4f213c477..05bdc5eb259881ff9893f932db7e54adf4b26d64 100644 (file)
@@ -3497,6 +3497,23 @@ static int __sip_autodestruct(const void *data)
        return 0;
 }
 
+/*! \brief Destroy all RTP instances allocated for a dialog */
+void sip_destroy_rtp(struct sip_pvt *p)
+{
+       if (p->rtp) {
+               ast_rtp_instance_destroy(p->rtp);
+               p->rtp = NULL;
+       }
+       if (p->vrtp) {
+               ast_rtp_instance_destroy(p->vrtp);
+               p->vrtp = NULL;
+       }
+       if (p->trtp) {
+               ast_rtp_instance_destroy(p->trtp);
+               p->trtp = NULL;
+       }
+}
+
 /*! \brief Schedule final destruction of SIP dialog.  This can not be canceled.
  *  This function is used to keep a dialog around for a period of time in order
  *  to properly respond to any retransmits. */
@@ -3510,6 +3527,8 @@ void sip_scheddestroy_final(struct sip_pvt *p, int ms)
        if (p->autokillid != -1) {
                p->final_destruction_scheduled = 1;
        }
+
+       sip_destroy_rtp(p);
 }
 
 /*! \brief Schedule destruction of SIP dialog */
@@ -5176,15 +5195,9 @@ void __sip_destroy(struct sip_pvt *p, int lockowner, int lockdialoglist)
                ast_free(p->notify->content);
                ast_free(p->notify);
        }
-       if (p->rtp) {
-               ast_rtp_instance_destroy(p->rtp);
-       }
-       if (p->vrtp) {
-               ast_rtp_instance_destroy(p->vrtp);
-       }
-       if (p->trtp) {
-               ast_rtp_instance_destroy(p->trtp);
-       }
+
+       sip_destroy_rtp(p);
+
        if (p->udptl)
                ast_udptl_destroy(p->udptl);
        if (p->refer)
index ed31b77742cf50d0ccbaa8c068f1b952cf21c1d0..08dd6d3f07430364935d8f4da3168822058021cb 100644 (file)
@@ -40,6 +40,10 @@ void sip_scheddestroy_final(struct sip_pvt *p, int ms);
 void sip_scheddestroy(struct sip_pvt *p, int ms);
 int sip_cancel_destroy(struct sip_pvt *p);
 
+/*! \brief Destroy the RTP instances associated with a dialog
+ */
+void sip_destroy_rtp(struct sip_pvt *p);
+
 /*! \brief Destroy SIP call structure.
  * Make it return NULL so the caller can do things like
  *     foo = sip_destroy(foo);