From: Simon McVittie Date: Thu, 28 Jul 2011 15:58:05 +0000 (+0100) Subject: Implement _dbus_atomic_get directly, rather than via inc + dec X-Git-Tag: dbus-1.4.14~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=89906f3e3d79f074156e16a12b4030188fd7e368;p=thirdparty%2Fdbus.git Implement _dbus_atomic_get directly, rather than via inc + dec The Windows implementation is untested, but does at least (cross-)compile, and matches what GLib does. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=38005 Reviewed-by: Lennart Poettering --- diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index c3c2245c5..e69f3b596 100644 --- a/dbus/dbus-sysdeps-unix.c +++ b/dbus/dbus-sysdeps-unix.c @@ -2355,6 +2355,29 @@ _dbus_atomic_dec (DBusAtomic *atomic) #endif } +/** + * Atomically get the value of an integer. It may change at any time + * thereafter, so this is mostly only useful for assertions. + * + * @param atomic pointer to the integer to get + * @returns the value at this moment + */ +dbus_int32_t +_dbus_atomic_get (DBusAtomic *atomic) +{ +#if DBUS_USE_SYNC + __sync_synchronize (); + return atomic->value; +#else + dbus_int32_t res; + + _DBUS_LOCK (atomic); + res = atomic->value; + _DBUS_UNLOCK (atomic); + return res; +#endif +} + #ifdef DBUS_BUILD_TESTS /** Gets our GID * @returns process GID diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index f9afadad5..a8c60bdaa 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -3081,6 +3081,21 @@ _dbus_atomic_dec (DBusAtomic *atomic) return InterlockedDecrement (&atomic->value) + 1; } +/** + * Atomically get the value of an integer. It may change at any time + * thereafter, so this is mostly only useful for assertions. + * + * @param atomic pointer to the integer to get + * @returns the value at this moment + */ +dbus_int32_t +_dbus_atomic_get (DBusAtomic *atomic) +{ + /* this is what GLib does, hopefully it's right... */ + MemoryBarrier (); + return atomic->value; +} + /** * Called when the bus daemon is signaled to reload its configuration; any * caches should be nuked. Of course any caches that need explicit reload diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 18f69dc3c..bab516dea 100644 --- a/dbus/dbus-sysdeps.c +++ b/dbus/dbus-sysdeps.c @@ -1067,30 +1067,6 @@ _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 */