Implement _dbus_atomic_get directly, rather than via inc + dec
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Thu, 28 Jul 2011 15:58:05 +0000 (16:58 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Fri, 29 Jul 2011 11:29:42 +0000 (12:29 +0100)
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>
dbus/dbus-sysdeps-unix.c
dbus/dbus-sysdeps-win.c
dbus/dbus-sysdeps.c

index c3c2245..e69f3b5 100644 (file)
@@ -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
index f9afada..a8c60bd 100644 (file)
@@ -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.
index 18f69dc..bab516d 100644 (file)
@@ -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 */