From 1e494ecc6094d412c3ae4ce25f51946b9278f3dd Mon Sep 17 00:00:00 2001 From: Simon McVittie Date: Mon, 13 Aug 2012 18:00:23 +0100 Subject: [PATCH] Use InterlockedExchange to get a full memory barrier on Windows See the bug for extensive discussion. Bug: https://bugs.freedesktop.org/show_bug.cgi?id=41423 Reviewed-by: Ralf Habacker --- dbus/dbus-sysdeps-win.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index bc4951b5..5a2fb209 100644 --- a/dbus/dbus-sysdeps-win.c +++ b/dbus/dbus-sysdeps-win.c @@ -3121,8 +3121,18 @@ _dbus_atomic_dec (DBusAtomic *atomic) dbus_int32_t _dbus_atomic_get (DBusAtomic *atomic) { - /* this is what GLib does, hopefully it's right... */ - MemoryBarrier (); + /* In this situation, GLib issues a MemoryBarrier() and then returns + * atomic->value. However, mingw from mingw.org (not to be confused with + * mingw-w64 from mingw-w64.sf.net) does not have MemoryBarrier in its + * headers, so we have to get a memory barrier some other way. + * + * InterlockedIncrement is older, and is documented on MSDN to be a full + * memory barrier, so let's use that. + */ + long dummy = 0; + + InterlockedExchange (&dummy, 1); + return atomic->value; }