rtsp-client: Session filter in unwatch session
authorGöran Jönsson <goranjn@axis.com>
Mon, 26 Sep 2016 09:16:04 +0000 (11:16 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 25 Oct 2016 09:55:59 +0000 (12:55 +0300)
Call session filter with filter_session_media as paramer in
client_unwatch_session if using drop_backlog = FALSE.

In client_unwatch_session its allowed to grow the watchs backlog.
If using drop_backlog = FALSE and the backlog is full it will cause
a deadlock when setting session media state to NULL
if the backlog is not allowed to grow.

https://bugzilla.gnome.org/show_bug.cgi?id=771983

gst/rtsp-server/rtsp-client.c

index e1e5338..deb2ab3 100644 (file)
@@ -416,6 +416,11 @@ client_unwatch_session (GstRTSPClient * client, GstRTSPSession * session,
     priv->session_removed_id = 0;
   }
 
+  if (!priv->drop_backlog) {
+    /* unlink all media managed in this session */
+    gst_rtsp_session_filter (session, filter_session_media, client);
+  }
+
   /* remove the session */
   g_object_unref (session);
 }
@@ -425,10 +430,13 @@ cleanup_session (GstRTSPClient * client, GstRTSPSession * sess,
     gpointer user_data)
 {
   gboolean *closed = user_data;
+  GstRTSPClientPrivate *priv = client->priv;
 
-  /* unlink all media managed in this session. This needs to happen
-   * without the client lock, so we really want to do it here. */
-  gst_rtsp_session_filter (sess, filter_session_media, user_data);
+  if (priv->drop_backlog) {
+    /* unlink all media managed in this session. This needs to happen
+     * without the client lock, so we really want to do it here. */
+    gst_rtsp_session_filter (sess, filter_session_media, user_data);
+  }
 
   if (*closed)
     return GST_RTSP_FILTER_REMOVE;