diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index bab516de..18f69dc3 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 22d7969e..54a4cd7e 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 */