summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/gl/gstglcontext.c37
1 files changed, 13 insertions, 24 deletions
diff --git a/gst-libs/gst/gl/gstglcontext.c b/gst-libs/gst/gl/gstglcontext.c
index 10cfe149c7..f84e78b503 100644
--- a/gst-libs/gst/gl/gstglcontext.c
+++ b/gst-libs/gst/gl/gstglcontext.c
@@ -189,7 +189,6 @@ struct _GstGLContextPrivate
/* conditions */
GMutex render_lock;
GCond create_cond;
- GCond destroy_cond;
gboolean created;
gboolean alive;
@@ -261,7 +260,6 @@ gst_gl_context_init (GstGLContext * context)
g_mutex_init (&context->priv->render_lock);
g_cond_init (&context->priv->create_cond);
- g_cond_init (&context->priv->destroy_cond);
context->priv->created = FALSE;
g_weak_ref_init (&context->priv->other_context_ref, NULL);
@@ -627,25 +625,16 @@ gst_gl_context_finalize (GObject * object)
gst_gl_window_set_draw_callback (context->window, NULL, NULL, NULL);
if (context->priv->alive) {
- g_mutex_lock (&context->priv->render_lock);
GST_INFO_OBJECT (context, "send quit gl window loop");
gst_gl_window_quit (context->window);
- while (context->priv->alive) {
- g_cond_wait (&context->priv->destroy_cond, &context->priv->render_lock);
- }
- g_mutex_unlock (&context->priv->render_lock);
- }
-
- gst_gl_window_set_close_callback (context->window, NULL, NULL, NULL);
- if (context->priv->gl_thread) {
- gpointer ret = g_thread_join (context->priv->gl_thread);
+ GST_INFO_OBJECT (context, "joining gl thread");
+ g_thread_join (context->priv->gl_thread);
GST_INFO_OBJECT (context, "gl thread joined");
- if (ret != NULL)
- GST_ERROR_OBJECT (context, "gl thread returned a non-null pointer");
context->priv->gl_thread = NULL;
}
+ gst_gl_window_set_close_callback (context->window, NULL, NULL, NULL);
gst_object_unref (context->window);
}
@@ -658,7 +647,6 @@ gst_gl_context_finalize (GObject * object)
g_mutex_clear (&context->priv->render_lock);
- g_cond_clear (&context->priv->destroy_cond);
g_cond_clear (&context->priv->create_cond);
g_free (context->priv->gl_exts);
@@ -948,9 +936,8 @@ gst_gl_context_create (GstGLContext * context,
context->priv->gl_thread = g_thread_new ("gstglcontext",
(GThreadFunc) gst_gl_context_create_thread, context);
- g_cond_wait (&context->priv->create_cond, &context->priv->render_lock);
-
- context->priv->created = TRUE;
+ while (!context->priv->created)
+ g_cond_wait (&context->priv->create_cond, &context->priv->render_lock);
GST_INFO_OBJECT (context, "gl thread created");
}
@@ -1045,6 +1032,8 @@ _compiled_api (void)
static void
_unlock_create_thread (GstGLContext * context)
{
+ context->priv->created = TRUE;
+ g_cond_signal (&context->priv->create_cond);
g_mutex_unlock (&context->priv->render_lock);
}
@@ -1215,9 +1204,8 @@ gst_gl_context_create_thread (GstGLContext * context)
gst_object_unref (other_context);
}
- g_cond_signal (&context->priv->create_cond);
-
-// g_mutex_unlock (&context->priv->render_lock);
+ /* unlocking of the render_lock happens when the
+ * context's loop is running from inside that loop */
gst_gl_window_send_message_async (context->window,
(GstGLWindowCB) _unlock_create_thread, context, NULL);
@@ -1226,7 +1214,6 @@ gst_gl_context_create_thread (GstGLContext * context)
GST_INFO_OBJECT (context, "loop exited");
g_mutex_lock (&context->priv->render_lock);
-
context->priv->alive = FALSE;
gst_gl_context_activate (context, FALSE);
@@ -1242,8 +1229,7 @@ gst_gl_context_create_thread (GstGLContext * context)
window_class->close (context->window);
}
- g_cond_signal (&context->priv->destroy_cond);
-
+ context->priv->created = FALSE;
g_mutex_unlock (&context->priv->render_lock);
return NULL;
@@ -1253,6 +1239,9 @@ failure:
if (other_context)
gst_object_unref (other_context);
+ /* A context that fails to be created is considered created but not alive
+ * and will never be able to be alive as creation can't happen */
+ context->priv->created = TRUE;
g_cond_signal (&context->priv->create_cond);
g_mutex_unlock (&context->priv->render_lock);
return NULL;