mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-29 10:38:27 +00:00
client: manage media in session as a last step
Once we manage a media in a session, we can't unmanage it anymore without destroying it. Therefore, first check everything before we manage the media, otherwise if something is wrong we have no way to unmanage the media. If we created a new session and something went wrong, remove the session again. Fixes a leak in the unit test.
This commit is contained in:
parent
fc6fa3f16a
commit
5aec4af1b9
3 changed files with 21 additions and 15 deletions
|
@ -1770,6 +1770,7 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx)
|
|||
GstRTSPClientClass *klass;
|
||||
gchar *path, *control;
|
||||
gint matched;
|
||||
gboolean new_session = FALSE;
|
||||
|
||||
if (!ctx->uri)
|
||||
goto no_uri;
|
||||
|
@ -1842,6 +1843,7 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx)
|
|||
/* make sure this client is closed when the session is closed */
|
||||
client_watch_session (client, session);
|
||||
|
||||
new_session = TRUE;
|
||||
/* signal new session */
|
||||
g_signal_emit (client, gst_rtsp_client_signals[SIGNAL_NEW_SESSION], 0,
|
||||
session);
|
||||
|
@ -1849,18 +1851,6 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx)
|
|||
ctx->session = session;
|
||||
}
|
||||
|
||||
if (sessmedia == NULL) {
|
||||
/* manage the media in our session now, if not done already */
|
||||
sessmedia = gst_rtsp_session_manage_media (session, path, media);
|
||||
/* if we stil have no media, error */
|
||||
if (sessmedia == NULL)
|
||||
goto sessmedia_unavailable;
|
||||
} else {
|
||||
g_object_unref (media);
|
||||
}
|
||||
|
||||
ctx->sessmedia = sessmedia;
|
||||
|
||||
if (!klass->configure_client_media (client, media, stream, ctx))
|
||||
goto configure_media_failed_no_reply;
|
||||
|
||||
|
@ -1881,6 +1871,18 @@ handle_setup_request (GstRTSPClient * client, GstRTSPContext * ctx)
|
|||
goto keymgmt_error;
|
||||
}
|
||||
|
||||
if (sessmedia == NULL) {
|
||||
/* manage the media in our session now, if not done already */
|
||||
sessmedia = gst_rtsp_session_manage_media (session, path, media);
|
||||
/* if we stil have no media, error */
|
||||
if (sessmedia == NULL)
|
||||
goto sessmedia_unavailable;
|
||||
} else {
|
||||
g_object_unref (media);
|
||||
}
|
||||
|
||||
ctx->sessmedia = sessmedia;
|
||||
|
||||
/* set in the session media transport */
|
||||
trans = gst_rtsp_session_media_set_transport (sessmedia, stream, ct);
|
||||
|
||||
|
@ -2014,6 +2016,8 @@ keymgmt_error:
|
|||
cleanup_transport:
|
||||
gst_rtsp_transport_free (ct);
|
||||
cleanup_session:
|
||||
if (new_session)
|
||||
gst_rtsp_session_pool_remove (priv->session_pool, session);
|
||||
g_object_unref (session);
|
||||
cleanup_path:
|
||||
g_free (path);
|
||||
|
|
|
@ -128,6 +128,8 @@ gst_rtsp_session_init (GstRTSPSession * session)
|
|||
|
||||
session->priv = priv;
|
||||
|
||||
GST_INFO ("init session %p", session);
|
||||
|
||||
g_mutex_init (&priv->lock);
|
||||
priv->timeout = DEFAULT_TIMEOUT;
|
||||
g_get_current_time (&priv->create_time);
|
||||
|
|
|
@ -602,7 +602,7 @@ GST_START_TEST (test_client_multicast_invalid_transport_specific)
|
|||
session_pool = gst_rtsp_client_get_session_pool (client);
|
||||
fail_unless (session_pool != NULL);
|
||||
/* FIXME: There seems to be a leak of a session here ! */
|
||||
/* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
|
||||
fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0);
|
||||
g_object_unref (session_pool);
|
||||
|
||||
|
||||
|
@ -623,7 +623,7 @@ GST_START_TEST (test_client_multicast_invalid_transport_specific)
|
|||
session_pool = gst_rtsp_client_get_session_pool (client);
|
||||
fail_unless (session_pool != NULL);
|
||||
/* FIXME: There seems to be a leak of a session here ! */
|
||||
/* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
|
||||
fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0);
|
||||
g_object_unref (session_pool);
|
||||
|
||||
|
||||
|
@ -644,7 +644,7 @@ GST_START_TEST (test_client_multicast_invalid_transport_specific)
|
|||
session_pool = gst_rtsp_client_get_session_pool (client);
|
||||
fail_unless (session_pool != NULL);
|
||||
/* FIXME: There seems to be a leak of a session here ! */
|
||||
/* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
|
||||
fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0);
|
||||
g_object_unref (session_pool);
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue