diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-07-28 16:58:05 +0100 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2011-07-29 12:29:42 +0100 |
commit | 89906f3e3d79f074156e16a12b4030188fd7e368 (patch) | |
tree | 6d34bccb30ddd92d625bb22e6f447bc06311b4b7 | |
parent | 0614a49274b85384f798beb3440c875091224c5a (diff) | |
download | dbus-89906f3e3d79f074156e16a12b4030188fd7e368.tar.gz |
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 <lennart@poettering.net>
-rw-r--r-- | dbus/dbus-sysdeps-unix.c | 23 | ||||
-rw-r--r-- | dbus/dbus-sysdeps-win.c | 15 | ||||
-rw-r--r-- | dbus/dbus-sysdeps.c | 24 |
3 files changed, 38 insertions, 24 deletions
diff --git a/dbus/dbus-sysdeps-unix.c b/dbus/dbus-sysdeps-unix.c index c3c2245c..e69f3b59 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 f9afadad..a8c60bda 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -3082,6 +3082,21 @@ _dbus_atomic_dec (DBusAtomic *atomic) } /** + * 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 * are probably broken, but c'est la vie. diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c index 18f69dc3..bab516de 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 */ |