summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOgnyan Tonchev <ognyan@axis.com>2014-06-12 13:49:17 +0200
committerWim Taymans <wtaymans@redhat.com>2014-06-18 15:23:15 +0200
commitf2b1aa8c817e78ff255c47d6f5637d528b7e2944 (patch)
tree4d5c490de533bf525c0a22e45e55cef20e7353cc
parent97152525887e7f8d83a26c739f59e5520383be54 (diff)
client: ref the context until rtsp watch is alive
Fixes https://bugzilla.gnome.org/show_bug.cgi?id=731569
-rw-r--r--gst/rtsp-server/rtsp-client.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c
index 4a8214f..cf79bda 100644
--- a/gst/rtsp-server/rtsp-client.c
+++ b/gst/rtsp-server/rtsp-client.c
@@ -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);