From: Göran Jönsson Date: Tue, 1 Jul 2014 10:22:56 +0000 (+0200) Subject: pad: Don't unlock while iterating over all sticky events for removal X-Git-Tag: 1.3.91~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d0a808cdc87c60f3dea4ac8d458324fd9e458ae7;p=platform%2Fupstream%2Fgstreamer.git pad: Don't unlock while iterating over all sticky events for removal Otherwise we might end up getting the event removed from elsewhere at the same time while we're unlocked for g_object_notify(). https://bugzilla.gnome.org/show_bug.cgi?id=732556 --- diff --git a/gst/gstpad.c b/gst/gstpad.c index 28170acea9..97158a0fe7 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -399,6 +399,7 @@ remove_events (GstPad * pad) { guint i, len; GArray *events; + gboolean notify = FALSE; events = pad->priv->events; @@ -409,19 +410,24 @@ remove_events (GstPad * pad) ev->event = NULL; - if (event && GST_EVENT_TYPE (event) == GST_EVENT_CAPS) { - GST_OBJECT_UNLOCK (pad); - - GST_DEBUG_OBJECT (pad, "notify caps"); - g_object_notify_by_pspec ((GObject *) pad, pspec_caps); + if (event && GST_EVENT_TYPE (event) == GST_EVENT_CAPS) + notify = TRUE; - GST_OBJECT_LOCK (pad); - } gst_event_unref (event); } + GST_OBJECT_FLAG_UNSET (pad, GST_PAD_FLAG_PENDING_EVENTS); g_array_set_size (events, 0); pad->priv->events_cookie++; + + if (notify) { + GST_OBJECT_UNLOCK (pad); + + GST_DEBUG_OBJECT (pad, "notify caps"); + g_object_notify_by_pspec ((GObject *) pad, pspec_caps); + + GST_OBJECT_LOCK (pad); + } } /* should be called with object lock */