From: Simon McVittie Date: Mon, 13 Aug 2012 17:00:23 +0000 (+0100) Subject: Use InterlockedExchange to get a full memory barrier on Windows X-Git-Tag: dbus-1.7.0~34 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1e494ecc6094d412c3ae4ce25f51946b9278f3dd;p=thirdparty%2Fdbus.git 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 --- diff --git a/dbus/dbus-sysdeps-win.c b/dbus/dbus-sysdeps-win.c index bc4951b5c..5a2fb209f 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; }