client: ref the context until rtsp watch is alive
authorOgnyan Tonchev <ognyan@axis.com>
Thu, 12 Jun 2014 11:49:17 +0000 (13:49 +0200)
committerWim Taymans <wtaymans@redhat.com>
Wed, 18 Jun 2014 13:23:15 +0000 (15:23 +0200)
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=731569

gst/rtsp-server/rtsp-client.c

index 4a8214f..cf79bda 100644 (file)
@@ -61,6 +61,7 @@ struct _GstRTSPClientPrivate
   GMutex send_lock;
   GstRTSPConnection *connection;
   GstRTSPWatch *watch;
+  GMainContext *watch_context;
   guint close_seq;
   gchar *server_ip;
   gboolean is_ipv6;
@@ -364,6 +365,9 @@ gst_rtsp_client_finalize (GObject * obj)
   if (priv->watch)
     g_source_destroy ((GSource *) priv->watch);
 
+  if (priv->watch_context)
+    g_main_context_unref (priv->watch_context);
+
   client_cleanup_sessions (client);
 
   if (priv->connection)
@@ -3230,6 +3234,8 @@ handle_tunnel (GstRTSPClient * client)
     /* the old client owns the tunnel now, the new one will be freed */
     g_source_destroy ((GSource *) priv->watch);
     priv->watch = NULL;
+    g_main_context_unref (priv->watch_context);
+    priv->watch_context = NULL;
     gst_rtsp_client_set_send_func (client, NULL, NULL, NULL);
   }
 
@@ -3314,6 +3320,8 @@ client_watch_notify (GstRTSPClient * client)
 
   GST_INFO ("client %p: watch destroyed", client);
   priv->watch = NULL;
+  g_main_context_unref (priv->watch_context);
+  priv->watch_context = NULL;
   g_signal_emit (client, gst_rtsp_client_signals[SIGNAL_CLOSED], 0, NULL);
   g_object_unref (client);
 }
@@ -3343,6 +3351,9 @@ gst_rtsp_client_attach (GstRTSPClient * client, GMainContext * context)
   g_return_val_if_fail (priv->connection != NULL, 0);
   g_return_val_if_fail (priv->watch == NULL, 0);
 
+  /* make sure noone will free the context before the watch is destroyed */
+  priv->watch_context = g_main_context_ref (context);
+
   /* create watch for the connection and attach */
   priv->watch = gst_rtsp_watch_new (priv->connection, &watch_funcs,
       g_object_ref (client), (GDestroyNotify) client_watch_notify);