baseaudiosrc: Add src object lock around call to ringbuffer parse caps.
authorStian Johansen <stian.johansen@tandberg.com>
Wed, 23 Feb 2011 09:55:12 +0000 (10:55 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 4 Apr 2011 07:35:58 +0000 (09:35 +0200)
A race was observed between query() and setcaps() where the latter would
change the ringbuffer spec while the former was performing operations
based this data.

gst-libs/gst/audio/gstbaseaudiosrc.c

index adf9254..7c7ec93 100644 (file)
@@ -560,14 +560,20 @@ gst_base_audio_src_setcaps (GstBaseSrc * bsrc, GstCaps * caps)
   spec->buffer_time = src->buffer_time;
   spec->latency_time = src->latency_time;
 
+  GST_OBJECT_LOCK (src);
   if (!gst_ring_buffer_parse_caps (spec, caps))
+  {
+    GST_OBJECT_UNLOCK (src);
     goto parse_error;
+  }
 
   /* calculate suggested segsize and segtotal */
   spec->segsize =
       spec->rate * spec->bytes_per_sample * spec->latency_time / GST_MSECOND;
   spec->segtotal = spec->buffer_time / spec->latency_time;
 
+  GST_OBJECT_UNLOCK (src);
+
   GST_DEBUG ("release old ringbuffer");
 
   gst_ring_buffer_release (src->ringbuffer);