X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Futils%2Fatomic.h;h=4f5f010afd31bd61551347f754fe9f31639b0bae;hb=1639e26a6b22a59d0bfb8ad564530eeff593e4a3;hp=c8c70007bc751d0a55d612c230a28450c79e968f;hpb=5e4093ab13c236eeb250cae17323bee655ccc936;p=mono.git diff --git a/mono/utils/atomic.h b/mono/utils/atomic.h index c8c70007bc7..4f5f010afd3 100755 --- a/mono/utils/atomic.h +++ b/mono/utils/atomic.h @@ -6,6 +6,7 @@ * * (C) 2002 Ximian, Inc. * Copyright 2012 Xamarin Inc + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #ifndef _WAPI_ATOMIC_H_ @@ -14,9 +15,12 @@ #include "config.h" #include -#ifdef ENABLE_EXTENSION_MODULE -#include "../../../mono-extensions/mono/utils/atomic.h" -#endif +/* +The current Nexus 7 arm-v7a fails with: +F/MonoDroid( 1568): shared runtime initialization error: Cannot load library: reloc_library[1285]: 37 cannot locate '__sync_val_compare_and_swap_8' + +Apple targets have historically being problematic, xcode 4.6 would miscompile the intrinsic. +*/ /* On Windows, we always use the functions provided by the Windows API. */ #if defined(__WIN32__) || defined(_WIN32) @@ -108,13 +112,19 @@ static inline gint64 InterlockedAdd64(volatile gint64 *dest, gint64 add) #endif #endif +#ifdef HOST_WIN32 +#define TO_INTERLOCKED_ARGP(ptr) ((volatile LONG*)(ptr)) +#else +#define TO_INTERLOCKED_ARGP(ptr) (ptr) +#endif + /* And now for some dirty hacks... The Windows API doesn't * provide any useful primitives for this (other than getting * into architecture-specific madness), so use CAS. */ static inline gint32 InterlockedRead(volatile gint32 *src) { - return InterlockedCompareExchange (src, 0, 0); + return InterlockedCompareExchange (TO_INTERLOCKED_ARGP (src), 0, 0); } static inline gint64 InterlockedRead64(volatile gint64 *src) @@ -129,7 +139,7 @@ static inline gpointer InterlockedReadPointer(volatile gpointer *src) static inline void InterlockedWrite(volatile gint32 *dst, gint32 val) { - InterlockedExchange (dst, val); + InterlockedExchange (TO_INTERLOCKED_ARGP (dst), val); } static inline void InterlockedWrite64(volatile gint64 *dst, gint64 val) @@ -167,7 +177,7 @@ static inline void InterlockedWrite16(volatile gint16 *dst, gint16 val) mono_memory_barrier (); } -/* Prefer GCC atomic ops if the target supports it (see configure.in). */ +/* Prefer GCC atomic ops if the target supports it (see configure.ac). */ #elif defined(USE_GCC_ATOMIC_OPS) static inline gint32 InterlockedCompareExchange(volatile gint32 *dest,