basesink: don't take preroll-lock in get_property
authorStefan Kost <ensonic@users.sf.net>
Sat, 25 Sep 2010 11:24:46 +0000 (14:24 +0300)
committerStefan Kost <ensonic@users.sf.net>
Tue, 5 Oct 2010 09:30:34 +0000 (12:30 +0300)
Use atomic ops to read and write more properties. Taking the preroll lock in get_property
can lock up applications reading the property during preroll.

libs/gst/base/gstbasesink.c

index aa39fa9..768f7c9 100644 (file)
@@ -843,7 +843,7 @@ gst_base_sink_set_async_enabled (GstBaseSink * sink, gboolean enabled)
   g_return_if_fail (GST_IS_BASE_SINK (sink));
 
   GST_PAD_PREROLL_LOCK (sink->sinkpad);
-  sink->priv->async_enabled = enabled;
+  g_atomic_int_set (&sink->priv->async_enabled, enabled);
   GST_LOG_OBJECT (sink, "set async enabled to %d", enabled);
   GST_PAD_PREROLL_UNLOCK (sink->sinkpad);
 }
@@ -867,9 +867,7 @@ gst_base_sink_is_async_enabled (GstBaseSink * sink)
 
   g_return_val_if_fail (GST_IS_BASE_SINK (sink), FALSE);
 
-  GST_PAD_PREROLL_LOCK (sink->sinkpad);
-  res = sink->priv->async_enabled;
-  GST_PAD_PREROLL_UNLOCK (sink->sinkpad);
+  res = g_atomic_int_get (&sink->priv->async_enabled);
 
   return res;
 }
@@ -1281,7 +1279,7 @@ gst_base_sink_set_property (GObject * object, guint prop_id,
     case PROP_PREROLL_QUEUE_LEN:
       /* preroll lock necessary to serialize with finish_preroll */
       GST_PAD_PREROLL_LOCK (sink->sinkpad);
-      sink->preroll_queue_max_len = g_value_get_uint (value);
+      g_atomic_int_set (&sink->preroll_queue_max_len, g_value_get_uint (value));
       GST_PAD_PREROLL_UNLOCK (sink->sinkpad);
       break;
     case PROP_SYNC:
@@ -1322,9 +1320,7 @@ gst_base_sink_get_property (GObject * object, guint prop_id, GValue * value,
 
   switch (prop_id) {
     case PROP_PREROLL_QUEUE_LEN:
-      GST_PAD_PREROLL_LOCK (sink->sinkpad);
-      g_value_set_uint (value, sink->preroll_queue_max_len);
-      GST_PAD_PREROLL_UNLOCK (sink->sinkpad);
+      g_value_set_uint (value, g_atomic_int_get (&sink->preroll_queue_max_len));
       break;
     case PROP_SYNC:
       g_value_set_boolean (value, gst_base_sink_get_sync (sink));