… | |
… | |
177 | * #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
177 | * #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
178 | */ |
178 | */ |
179 | |
179 | |
180 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
180 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
181 | #define ECB_MEMORY_FENCE __sync_synchronize () |
181 | #define ECB_MEMORY_FENCE __sync_synchronize () |
|
|
182 | #elif _MSC_VER >= 1500 /* VC++ 2008 */ |
|
|
183 | /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */ |
|
|
184 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
|
|
185 | #define ECB_MEMORY_FENCE _ReadWriteBarrier (); MemoryBarrier() |
|
|
186 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */ |
|
|
187 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier() |
182 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
188 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
183 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
189 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
184 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
190 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
185 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
191 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
186 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |
192 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |