From: Joshua Colp Date: Wed, 26 Jul 2017 16:39:32 +0000 (+0000) Subject: res_pjsip_session: Release media resources on session end quicker. X-Git-Tag: 15.1.0-rc1~148 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8f51443a08e00335fbf83584d150edbac35c4a17;p=thirdparty%2Fasterisk.git 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 know the session is ending we release the media resources immediately. ASTERISK-27110 Change-Id: I3c6a82fe7d2c50b9dc9197cb12ef22f20d337501 --- diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index ebda6c7ee1..dd03b74ae8 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -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); } diff --git a/res/res_pjsip_session.c b/res/res_pjsip_session.c index bb349a4b67..40b197bf7c 100644 --- a/res/res_pjsip_session.c +++ b/res/res_pjsip_session.c @@ -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; }