]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_pjsip_session: Release media resources on session end quicker.
authorJoshua Colp <jcolp@digium.com>
Wed, 26 Jul 2017 16:39:32 +0000 (16:39 +0000)
committerGeorge Joseph <gjoseph@digium.com>
Tue, 1 Aug 2017 21:39:26 +0000 (15:39 -0600)
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 know the session is ending we
release the media resources immediately.

ASTERISK-27110

Change-Id: I3c6a82fe7d2c50b9dc9197cb12ef22f20d337501

channels/chan_pjsip.c
res/res_pjsip_session.c

index ebda6c7ee174082fc22c5d7177f2bc7cfa4393c6..dd03b74ae895833328d71ecafe36ee3ea63e0c6f 100644 (file)
@@ -2273,7 +2273,6 @@ static struct hangup_data *hangup_data_alloc(int cause, struct ast_channel *chan
 static void clear_session_and_channel(struct ast_sip_session *session, struct ast_channel *ast)
 {
        session->channel = NULL;
-       set_channel_on_rtp_instance(session, "");
        ast_channel_tech_pvt_set(ast, NULL);
 }
 
index bb349a4b67d18f658748ee9f9b74dcc52fcdb1eb..40b197bf7c461812b41847a8a899ea5349f33a2b 100644 (file)
@@ -1872,8 +1872,12 @@ static void session_destructor(void *obj)
 
        ast_taskprocessor_unreference(session->serializer);
        ao2_cleanup(session->datastores);
-       ast_sip_session_media_state_free(session->active_media_state);
-       ast_sip_session_media_state_free(session->pending_media_state);
+       if (session->active_media_state) {
+               ast_sip_session_media_state_free(session->active_media_state);
+       }
+       if (session->pending_media_state) {
+               ast_sip_session_media_state_free(session->pending_media_state);
+       }
 
        AST_LIST_HEAD_DESTROY(&session->supplements);
        while ((delay = AST_LIST_REMOVE_HEAD(&session->delayed_requests, next))) {
@@ -3134,6 +3138,13 @@ static int session_end(void *vsession)
                        iter->session_end(session);
                }
        }
+
+       /* Release any media resources. */
+       ast_sip_session_media_state_free(session->active_media_state);
+       session->active_media_state = NULL;
+       ast_sip_session_media_state_free(session->pending_media_state);
+       session->pending_media_state = NULL;
+
        return 0;
 }