Add _dbus_atomic_get implemented in terms of inc, dec
authorSimon McVittie <simon.mcvittie@collabora.co.uk>
Thu, 14 Jul 2011 16:07:08 +0000 (17:07 +0100)
committerSimon McVittie <simon.mcvittie@collabora.co.uk>
Mon, 25 Jul 2011 17:15:34 +0000 (18:15 +0100)
Reviewed-by: Cosimo Alfarano <cosimo.alfarano@collabora.co.uk>
Bug: https://bugs.freedesktop.org/show_bug.cgi?id=38005

dbus/dbus-sysdeps.c
dbus/dbus-sysdeps.h

index bab516d..18f69dc 100644 (file)
@@ -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 */
index 22d7969..54a4cd7 100644 (file)
@@ -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 */