glvideomixer: fix race retrieving the GL context from the display

_get_gl_context() can be called concurrently from either propose_allocation() or
decide_allocation().  If it so happens that this happens at the same time,
the check for whether we already had a GL context was outside the lock.  Inside
the lock and loop, the first thing that happens is that we unref the current GL
context (if valid) as if there was a conflict adding it to the display.  If the
timing was unlucky, subsequent use of the GL context would be referencing an
already unreffed GL context object resulting in a critical:

g_object_ref: assertion 'object->ref_count > 0' failed

https://bugzilla.gnome.org/show_bug.cgi?id=766703
This commit is contained in:
Matthew Waters 2016-05-24 23:39:27 +10:00
parent 396932f412
commit 11bb4454a8

View file

@ -195,8 +195,8 @@ _get_gl_context (GstGLBaseMixer * mix)
_find_local_gl_context (mix);
GST_OBJECT_LOCK (mix->display);
if (!mix->context) {
GST_OBJECT_LOCK (mix->display);
do {
if (mix->context) {
gst_object_unref (mix->context);
@ -213,8 +213,8 @@ _get_gl_context (GstGLBaseMixer * mix)
}
}
} while (!gst_gl_display_add_context (mix->display, mix->context));
GST_OBJECT_UNLOCK (mix->display);
}
GST_OBJECT_UNLOCK (mix->display);
{
GstGLAPI current_gl_api = gst_gl_context_get_gl_api (mix->context);