From ef68e5ade2278845f20e24f7e30ac6826f6a1fbd Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Mon, 15 Jul 2013 15:25:57 +0200 Subject: [PATCH] [751/906] gldisplay: Don't hold lock while sending a message to the GL thread https://bugzilla.gnome.org/show_bug.cgi?id=704247 --- gst-libs/gst/gl/gstgldisplay.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c index 6a560c1..2c17b3f 100644 --- a/gst-libs/gst/gl/gstgldisplay.c +++ b/gst-libs/gst/gl/gstgldisplay.c @@ -41,12 +41,10 @@ G_DEFINE_TYPE_WITH_CODE (GstGLDisplay, gst_gl_display, G_TYPE_OBJECT, (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_TYPE_GL_DISPLAY, GstGLDisplayPrivate)) static void gst_gl_display_finalize (GObject * object); -static void _gst_gl_display_thread_run_generic (GstGLDisplay * display); struct _GstGLDisplayPrivate { - GstGLDisplayThreadFunc func; - gpointer data; + gint dummy; }; /*------------------------------------------------------------ @@ -91,13 +89,21 @@ gst_gl_display_finalize (GObject * object) G_OBJECT_CLASS (gst_gl_display_parent_class)->finalize (object); } +typedef struct +{ + GstGLDisplay *display; + GstGLDisplayThreadFunc func; + gpointer data; +} RunGenericData; + static void -_gst_gl_display_thread_run_generic (GstGLDisplay * display) +_gst_gl_display_thread_run_generic (RunGenericData * data) { - GST_TRACE ("running function:%p data:%p", - display->priv->func, display->priv->data); + GST_TRACE ("running function:%p data:%p", data->func, data->data); - display->priv->func (display, display->priv->data); + data->func (data->display, data->data); + g_object_unref (data->display); + g_slice_free (RunGenericData, data); } GstGLDisplay * @@ -110,19 +116,19 @@ void gst_gl_display_thread_add (GstGLDisplay * display, GstGLDisplayThreadFunc func, gpointer data) { + RunGenericData *rdata; + g_return_if_fail (GST_IS_GL_DISPLAY (display)); g_return_if_fail (GST_GL_IS_WINDOW (display->window)); g_return_if_fail (func != NULL); - gst_gl_display_lock (display); - - display->priv->data = data; - display->priv->func = func; + rdata = g_slice_new (RunGenericData); + rdata->display = g_object_ref (display); + rdata->data = data; + rdata->func = func; gst_gl_window_send_message (display->window, - GST_GL_WINDOW_CB (_gst_gl_display_thread_run_generic), display); - - gst_gl_display_unlock (display); + GST_GL_WINDOW_CB (_gst_gl_display_thread_run_generic), rdata); } GstGLAPI -- 2.7.4