From b44a5c8dc769b951a0d02cc55225652fdfc23402 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 28 Jan 2010 17:12:34 +0100 Subject: [PATCH] adder: don't hold object lock when calling peer elements Do not hold the object lock while we call methods on peer elements as this can lead to deadlocks. Fixes #608179 --- gst/adder/gstadder.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/gst/adder/gstadder.c b/gst/adder/gstadder.c index 4dc9fd4..8d0b300 100644 --- a/gst/adder/gstadder.c +++ b/gst/adder/gstadder.c @@ -232,11 +232,16 @@ static GstCaps * gst_adder_sink_getcaps (GstPad * pad) { GstAdder *adder; - GstCaps *result, *peercaps, *sinkcaps; + GstCaps *result, *peercaps, *sinkcaps, *filter_caps; adder = GST_ADDER (GST_PAD_PARENT (pad)); GST_OBJECT_LOCK (adder); + /* take filter */ + if ((filter_caps = adder->filter_caps)) + gst_caps_ref (filter_caps); + GST_OBJECT_UNLOCK (adder); + /* get the downstream possible caps */ peercaps = gst_pad_peer_get_caps (adder->srcpad); @@ -245,9 +250,9 @@ gst_adder_sink_getcaps (GstPad * pad) sinkcaps = gst_pad_get_fixed_caps_func (pad); if (peercaps) { /* restrict with filter-caps if any */ - if (adder->filter_caps) { + if (filter_caps) { GST_DEBUG_OBJECT (adder, "filtering peer caps"); - result = gst_caps_intersect (peercaps, adder->filter_caps); + result = gst_caps_intersect (peercaps, filter_caps); gst_caps_unref (peercaps); peercaps = result; } @@ -260,16 +265,18 @@ gst_adder_sink_getcaps (GstPad * pad) /* the peer has no caps (or there is no peer), just use the allowed caps * of this sinkpad. */ /* restrict with filter-caps if any */ - if (adder->filter_caps) { + if (filter_caps) { GST_DEBUG_OBJECT (adder, "no peer caps, using filtered sinkcaps"); - result = gst_caps_intersect (sinkcaps, adder->filter_caps); + result = gst_caps_intersect (sinkcaps, filter_caps); gst_caps_unref (sinkcaps); } else { GST_DEBUG_OBJECT (adder, "no peer caps, using sinkcaps"); result = sinkcaps; } } - GST_OBJECT_UNLOCK (adder); + + if (filter_caps) + gst_caps_unref (filter_caps); GST_LOG_OBJECT (adder, "getting caps on pad %p,%s to %" GST_PTR_FORMAT, pad, GST_PAD_NAME (pad), result); -- 2.7.4