From 3f89954c271e985a6d20d5cf1266cd2d448753df Mon Sep 17 00:00:00 2001 From: Sebastian Dröge Date: Fri, 31 Dec 2010 12:27:45 +0100 Subject: inputselector: Protected g_object_notify() calls for the active-pad with a recursive mutex This works around a thread safety problem in GLib < 2.26.0 and should be removed when we depend on 2.26.0. Fixes bug #607513. --- plugins/elements/gstinputselector.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/plugins/elements/gstinputselector.c b/plugins/elements/gstinputselector.c index fd32151b0d..4dc7dc60bb 100644 --- a/plugins/elements/gstinputselector.c +++ b/plugins/elements/gstinputselector.c @@ -42,6 +42,15 @@ GST_DEBUG_CATEGORY_STATIC (input_selector_debug); #define GST_CAT_DEFAULT input_selector_debug +#if GLIB_CHECK_VERSION(2, 26, 0) +#define NOTIFY_MUTEX_LOCK() +#define NOTIFY_MUTEX_UNLOCK() +#else +static GStaticRecMutex notify_mutex = G_STATIC_REC_MUTEX_INIT; +#define NOTIFY_MUTEX_LOCK() g_static_rec_mutex_lock (¬ify_mutex) +#define NOTIFY_MUTEX_UNLOCK() g_static_rec_mutex_unlock (¬ify_mutex) +#endif + static GstStaticPadTemplate gst_input_selector_sink_factory = GST_STATIC_PAD_TEMPLATE ("sink%d", GST_PAD_SINK, @@ -353,8 +362,11 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event) forward = FALSE; GST_INPUT_SELECTOR_UNLOCK (sel); - if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) + if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) { + NOTIFY_MUTEX_LOCK (); g_object_notify (G_OBJECT (sel), "active-pad"); + NOTIFY_MUTEX_UNLOCK (); + } switch (GST_EVENT_TYPE (event)) { case GST_EVENT_FLUSH_START: @@ -498,8 +510,11 @@ gst_selector_pad_bufferalloc (GstPad * pad, guint64 offset, GST_INPUT_SELECTOR_UNLOCK (sel); - if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) + if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) { + NOTIFY_MUTEX_LOCK (); g_object_notify (G_OBJECT (sel), "active-pad"); + NOTIFY_MUTEX_UNLOCK (); + } result = gst_pad_alloc_buffer (sel->srcpad, offset, size, caps, buf); @@ -620,8 +635,11 @@ gst_selector_pad_chain (GstPad * pad, GstBuffer * buf) } GST_INPUT_SELECTOR_UNLOCK (sel); - if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) + if (prev_active_sinkpad != active_sinkpad && pad == active_sinkpad) { + NOTIFY_MUTEX_LOCK (); g_object_notify (G_OBJECT (sel), "active-pad"); + NOTIFY_MUTEX_UNLOCK (); + } if (close_event) gst_pad_push_event (sel->srcpad, close_event); @@ -1453,8 +1471,11 @@ gst_input_selector_switch (GstInputSelector * self, GstPad * pad, GST_INPUT_SELECTOR_BROADCAST (self); GST_INPUT_SELECTOR_UNLOCK (self); - if (changed) + if (changed) { + NOTIFY_MUTEX_LOCK (); g_object_notify (G_OBJECT (self), "active-pad"); + NOTIFY_MUTEX_UNLOCK (); + } } static gboolean -- cgit v1.2.3