X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=inline;f=mono%2Futils%2Fmono-membar.h;h=b59ffff85f93b28573c3089420381f8eeef6b484;hb=3fd54893bc792eee42164bfb605b418105a92f92;hp=dd37c80660f11f04c43e5a67ac14952a5829fdeb;hpb=4df4b7a47a07d924d7bfcfc53f43bd2319b54266;p=mono.git diff --git a/mono/utils/mono-membar.h b/mono/utils/mono-membar.h index dd37c80660f..b59ffff85f9 100644 --- a/mono/utils/mono-membar.h +++ b/mono/utils/mono-membar.h @@ -14,93 +14,41 @@ #include -#if defined(__x86_64__) || defined(TARGET_AMD64) -#ifndef _MSC_VER -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("mfence" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - __asm__ __volatile__ ("lfence" : : : "memory"); -} - -static inline void mono_memory_write_barrier (void) -{ - __asm__ __volatile__ ("sfence" : : : "memory"); -} -#else -#include - -static inline void mono_memory_barrier (void) -{ - _ReadWriteBarrier (); -} - -static inline void mono_memory_read_barrier (void) -{ - _ReadBarrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - _WriteBarrier (); -} +#ifdef _MSC_VER +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN #endif -#elif defined(__i386__) || defined(TARGET_X86) -#ifndef _MSC_VER -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - mono_memory_barrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - mono_memory_barrier (); -} -#else +#include #include static inline void mono_memory_barrier (void) { + /* NOTE: _ReadWriteBarrier and friends only prevent the + compiler from reordering loads and stores. To prevent + the CPU from doing the same, we have to use the + MemoryBarrier macro which expands to e.g. a serializing + XCHG instruction on x86. Also note that the MemoryBarrier + macro does *not* imply _ReadWriteBarrier, so that call + cannot be eliminated. */ _ReadWriteBarrier (); + MemoryBarrier (); } static inline void mono_memory_read_barrier (void) { _ReadBarrier (); + MemoryBarrier (); } static inline void mono_memory_write_barrier (void) { _WriteBarrier (); + MemoryBarrier (); } -#endif -#elif defined(sparc) || defined(__sparc__) +#elif defined(USE_GCC_ATOMIC_OPS) static inline void mono_memory_barrier (void) { - __asm__ __volatile__ ("membar #LoadLoad | #LoadStore | #StoreStore | #StoreLoad" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - __asm__ __volatile__ ("membar #LoadLoad" : : : "memory"); -} - -static inline void mono_memory_write_barrier (void) -{ - __asm__ __volatile__ ("membar #StoreStore" : : : "memory"); -} -#elif defined(__s390__) -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("bcr 15,0" : : : "memory"); + __sync_synchronize (); } static inline void mono_memory_read_barrier (void) @@ -112,81 +60,8 @@ static inline void mono_memory_write_barrier (void) { mono_memory_barrier (); } -#elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__) -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("sync" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - mono_memory_barrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - __asm__ __volatile__ ("eieio" : : : "memory"); -} - -#elif defined(__arm__) -static inline void mono_memory_barrier (void) -{ -#ifdef HAVE_ARMV6 - __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory"); -#endif -} - -static inline void mono_memory_read_barrier (void) -{ - mono_memory_barrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - mono_memory_barrier (); -} -#elif defined(__ia64__) -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("mf" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - mono_memory_barrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - mono_memory_barrier (); -} -#elif defined(__mips__) -static inline void mono_memory_barrier (void) -{ - __asm__ __volatile__ ("" : : : "memory"); -} - -static inline void mono_memory_read_barrier (void) -{ - mono_memory_barrier (); -} - -static inline void mono_memory_write_barrier (void) -{ - mono_memory_barrier (); -} -#elif defined(MONO_CROSS_COMPILE) -static inline void mono_memory_barrier (void) -{ -} - -static inline void mono_memory_read_barrier (void) -{ -} - -static inline void mono_memory_write_barrier (void) -{ -} +#else +#error "Don't know how to do memory barriers!" #endif #endif /* _MONO_UTILS_MONO_MEMBAR_H_ */