From 6f0a59aa13f623f7cd2457274c33fd8e4803f674 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 1 Feb 2008 10:23:56 +0000 Subject: [PATCH] gst/gstminiobject.c: When replacing a miniobject, do a quick equality check first so that we can avoid a ref/unref pair. Original commit message from CVS: * gst/gstminiobject.c: (gst_mini_object_replace): When replacing a miniobject, do a quick equality check first so that we can avoid a ref/unref pair. --- ChangeLog | 6 ++++++ gst/gstminiobject.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index cdb4bbf..234bb22 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-02-01 Wim Taymans + * gst/gstminiobject.c: (gst_mini_object_replace): + When replacing a miniobject, do a quick equality check first so that we + can avoid a ref/unref pair. + +2008-02-01 Wim Taymans + * docs/design/part-synchronisation.txt: Update some docs. diff --git a/gst/gstminiobject.c b/gst/gstminiobject.c index 636ff98..7d19248 100644 --- a/gst/gstminiobject.c +++ b/gst/gstminiobject.c @@ -364,13 +364,18 @@ gst_mini_object_replace (GstMiniObject ** olddata, GstMiniObject * newdata) newdata, newdata ? newdata->refcount : 0); #endif + olddata_val = g_atomic_pointer_get ((gpointer *) olddata); + + if (olddata_val == newdata) + return; + if (newdata) gst_mini_object_ref (newdata); - do { + while (!g_atomic_pointer_compare_and_exchange ((gpointer *) olddata, + olddata_val, newdata)) { olddata_val = g_atomic_pointer_get ((gpointer *) olddata); - } while (!g_atomic_pointer_compare_and_exchange ((gpointer *) olddata, - olddata_val, newdata)); + } if (olddata_val) gst_mini_object_unref (olddata_val); -- 2.7.4