]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/gstreamer0-10.git/commitdiff
multiqueue: Increment unique item counter with atomic operations
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 21 Mar 2011 16:52:13 +0000 (17:52 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Mon, 21 Mar 2011 16:52:59 +0000 (17:52 +0100)
Before it was only protected by the stream lock but every pad
has its own stream lock, making the protection rather useless.

plugins/elements/gstmultiqueue.c
plugins/elements/gstmultiqueue.h

index f1956dae9ebd84fdb3fb704771eb09e432cc92ce..3f1eef570507c357507d14f8502847a828cbb01f 100644 (file)
@@ -1229,7 +1229,7 @@ gst_multi_queue_chain (GstPad * pad, GstBuffer * buffer)
     goto was_eos;
 
   /* Get a unique incrementing id */
-  curid = mq->counter++;
+  curid = g_atomic_int_exchange_and_add ((gint *) & mq->counter, 1);
 
   GST_LOG_OBJECT (mq, "SingleQueue %d : about to enqueue buffer %p with id %d",
       sq->id, buffer, curid);
@@ -1334,9 +1334,8 @@ gst_multi_queue_sink_event (GstPad * pad, GstEvent * event)
   if (sq->is_eos)
     goto was_eos;
 
-  /* Get an unique incrementing id. protected with the STREAM_LOCK, unserialized
-   * events already got pushed and don't end up in the queue. */
-  curid = mq->counter++;
+  /* Get an unique incrementing id. */
+  curid = g_atomic_int_exchange_and_add ((gint *) & mq->counter, 1);
 
   item = gst_multi_queue_event_item_new ((GstMiniObject *) event, curid);
 
index ec47601d08ce67c04ec7ee21300497698a92ca28..60262b7c137ee3ded218ee49f1aef104bb096d61 100644 (file)
@@ -63,7 +63,7 @@ struct _GstMultiQueue {
   gboolean buffering;
   gint percent;
 
-  guint32  counter;    /* incoming object counter, protected with STREAM_LOCK */
+  guint32  counter;    /* incoming object counter, use atomic accesses */
   guint32  highid;     /* contains highest id of last outputted object */
 
   GMutex * qlock;      /* Global queue lock (vs object lock or individual */