Use InterlockedExchange64 () for Interlocked.Exchange (double&, double).
authorAlex Rønne Petersen <alexrp@xamarin.com>
Wed, 25 Sep 2013 18:23:36 +0000 (20:23 +0200)
committerAlex Rønne Petersen <alexrp@xamarin.com>
Mon, 21 Oct 2013 15:59:28 +0000 (17:59 +0200)
mono/metadata/threads.c

index a6d031245cae13ad6909fbe807020c6e58f5171b..8a28cc00a6d8efd200a30bb522b536470fc3a897 100755 (executable)
@@ -1839,27 +1839,12 @@ ves_icall_System_Threading_Interlocked_Exchange_Long (gint64 *location, gint64 v
 gdouble 
 ves_icall_System_Threading_Interlocked_Exchange_Double (gdouble *location, gdouble value)
 {
-#if SIZEOF_VOID_P == 8
        LongDoubleUnion val, ret;
 
        val.fval = value;
-       ret.ival = (gint64)InterlockedExchangePointer((gpointer *) location, (gpointer)val.ival);
+       ret.ival = (gint64)InterlockedExchange64((gint64 *) location, val.ival);
 
        return ret.fval;
-#else
-       gdouble res;
-
-       /* 
-        * According to MSDN, this function is only atomic with regards to the 
-        * other Interlocked functions on 32 bit platforms.
-        */
-       mono_interlocked_lock ();
-       res = *location;
-       *location = value;
-       mono_interlocked_unlock ();
-
-       return res;
-#endif
 }
 
 gint32 ves_icall_System_Threading_Interlocked_CompareExchange_Int(gint32 *location, gint32 value, gint32 comparand)