diff options
author | Ognyan Tonchev <ognyan@axis.com> | 2014-06-12 13:49:17 +0200 |
---|---|---|
committer | Wim Taymans <wtaymans@redhat.com> | 2014-06-18 15:23:15 +0200 |
commit | f2b1aa8c817e78ff255c47d6f5637d528b7e2944 (patch) | |
tree | 4d5c490de533bf525c0a22e45e55cef20e7353cc | |
parent | 97152525887e7f8d83a26c739f59e5520383be54 (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.c | 11 |
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); |