*
* (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_
#include "config.h"
#include <glib.h>
-#ifdef ENABLE_EXTENSION_MODULE
-#include "../../../mono-extensions/mono/utils/atomic.h"
+/*
+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.
+*/
+
+#if defined (__arm__) && defined (HAVE_ARMV7)
+#define HAVE_64BIT_CMPXCHG_FALLBACK /* See atomic.c in this directory. */
#endif
/* On Windows, we always use the functions provided by the Windows API. */
#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)
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)
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,