Fix mono_gc_wbarrier_generic_store_atomic semantics.
authorAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 23 Oct 2013 21:10:16 +0000 (23:10 +0200)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 23 Oct 2013 22:06:23 +0000 (00:06 +0200)
It should ensure that stores are fully atomic with barriers.

mono/metadata/boehm-gc.c
mono/metadata/null-gc.c
mono/metadata/sgen-gc.c

index a97b950969f58fca8e29260a1dc15e76db10f0ef..b858650c874c5b213684f311f8802926f9a93ca6 100644 (file)
@@ -21,6 +21,7 @@
 #include <mono/metadata/metadata-internals.h>
 #include <mono/metadata/marshal.h>
 #include <mono/metadata/runtime.h>
+#include <mono/utils/atomic.h>
 #include <mono/utils/mono-logger-internal.h>
 #include <mono/utils/mono-memory-model.h>
 #include <mono/utils/mono-time.h>
@@ -627,7 +628,7 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
 void
 mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
 {
-       mono_atomic_store_release ((volatile MonoObject **) ptr, value);
+       InterlockedWritePointer (ptr, value);
 }
 
 void
index 0430dd5cbf62ce76f4d905d116a71c4216e8b19a..86a2528b09f62a876d48a9d513c1c8364975350b 100644 (file)
@@ -195,7 +195,7 @@ mono_gc_wbarrier_generic_store (gpointer ptr, MonoObject* value)
 void
 mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
 {
-       mono_atomic_store_release ((volatile MonoObject **) ptr, value);
+       InterlockedWritePointer (ptr, value);
 }
 
 void
index da89a5f74f50175b016ef0fc6c731bb587ba7b1c..283d61bdb51779cf9b7498bfa56a6e13da72632c 100644 (file)
@@ -4400,7 +4400,7 @@ mono_gc_wbarrier_generic_store_atomic (gpointer ptr, MonoObject *value)
 
        SGEN_LOG (8, "Wbarrier atomic store at %p to %p (%s)", ptr, value, value ? safe_name (value) : "null");
 
-       mono_atomic_store_release ((volatile MonoObject **) ptr, value);
+       InterlockedWritePointer (ptr, value);
 
        if (ptr_in_nursery (value))
                mono_gc_wbarrier_generic_nostore (ptr);