From: Sebastian Dröge Date: Mon, 21 Mar 2011 16:52:13 +0000 (+0100) Subject: multiqueue: Increment unique item counter with atomic operations X-Git-Tag: RELEASE-0.10.33~294 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=383cac91b103fa4b133428cc6196f35a1cd7904d;p=platform%2Fupstream%2Fgstreamer.git multiqueue: Increment unique item counter with atomic operations Before it was only protected by the stream lock but every pad has its own stream lock, making the protection rather useless. --- diff --git a/plugins/elements/gstmultiqueue.c b/plugins/elements/gstmultiqueue.c index f1956da..3f1eef5 100644 --- a/plugins/elements/gstmultiqueue.c +++ b/plugins/elements/gstmultiqueue.c @@ -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); diff --git a/plugins/elements/gstmultiqueue.h b/plugins/elements/gstmultiqueue.h index ec47601d..60262b7 100644 --- a/plugins/elements/gstmultiqueue.h +++ b/plugins/elements/gstmultiqueue.h @@ -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 */