summaryrefslogtreecommitdiff
path: root/res
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-08-05 11:36:49 +0000
committerJoshua Colp <jcolp@digium.com>2017-08-08 00:53:24 +0000
commit9685a704a6d7a73cccd78f517b168d8a71d82e56 (patch)
tree59955ea88f007c383d0c35477bc6abf7c56c0c5f /res
parent2014a695f735d14456b5631bec9e2a32a8226609 (diff)
res_pjsip_session: Release media resources on session end quicker.
A change was made long ago where the session was kept around until the underlying INVITE session had been destroyed. This had the side effect of also keeping the underlying media resources around for this time as well. This change ensures that when we are told to terminate the session we immediately release any media sessions associated with it. ASTERISK-27110 Change-Id: I643e431d5c3bf05cda220c1d39e824a505a29b82
Diffstat (limited to 'res')
-rw-r--r--res/res_pjsip_session.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c
index bb349a4b6..31e20142d 100644
--- a/res/res_pjsip_session.c
+++ b/res/res_pjsip_session.c
@@ -2396,6 +2396,15 @@ void ast_sip_session_terminate(struct ast_sip_session *session, int response)
response = 603;
}
+ /* The media sessions need to exist for the lifetime of the underlying channel
+ * to ensure that anything (such as bridge_native_rtp) has access to them as
+ * appropriate. Since ast_sip_session_terminate is called by chan_pjsip and other
+ * places when the session is to be terminated we terminate any existing
+ * media sessions here.
+ */
+ SWAP(session->active_media_state, session->pending_media_state);
+ ast_sip_session_media_state_reset(session->pending_media_state);
+
switch (session->inv_session->state) {
case PJSIP_INV_STATE_NULL:
if (!session->inv_session->invite_tsx) {