From 7d11503a5f6c42889b248c261ee836a8cf00b967 Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Thu, 14 Jul 2011 17:07:08 +0100 Subject: [PATCH 4/9] Add _dbus_atomic_get implemented in terms of inc, dec --- dbus/dbus-sysdeps.c | 24 ++++++++++++++++++++++++ dbus/dbus-sysdeps.h | 1 + 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index bab516d..18f69dc 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -1067,6 +1067,30 @@ _dbus_strerror_from_errno (void) return _dbus_strerror (errno); } +/** + * Atomically get the value of an integer. It may change at any time + * thereafter, so this is mostly only useful for assertions. + * + * This function temporarily increases the atomic integer, so only + * use it in contexts where that would be OK (such as refcounts). + * + * @param atomic pointer to the integer to increment + * @returns the value at this moment + */ +dbus_int32_t +_dbus_atomic_get (DBusAtomic *atomic) +{ + dbus_int32_t old_value; + + /* On Windows we use InterlockedIncrement and InterlockedDecrement, + * and there is no InterlockedGet, so we have to change the value. + * Increasing it is less likely to have bad side-effects (for instance, + * it's OK for refcounts). */ + old_value = _dbus_atomic_inc (atomic); + _dbus_atomic_dec (atomic); + return old_value; +} + /** @} end of sysdeps */ /* tests in dbus-sysdeps-util.c */ diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h index 22d7969..54a4cd7 100644 --- a/dbus/dbus-sysdeps.h +++ b/dbus/dbus-sysdeps.h @@ -244,6 +244,7 @@ struct DBusAtomic dbus_int32_t _dbus_atomic_inc (DBusAtomic *atomic); dbus_int32_t _dbus_atomic_dec (DBusAtomic *atomic); +dbus_int32_t _dbus_atomic_get (DBusAtomic *atomic); /* AIX uses different values for poll */ -- 1.7.5.4