… | |
… | |
92 | |
92 | |
93 | /* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ |
93 | /* ECB_NO_THREADS - ecb is not used by multiple threads, ever */ |
94 | /* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ |
94 | /* ECB_NO_SMP - ecb might be used in multiple threads, but only on a single cpu */ |
95 | |
95 | |
96 | #if ECB_NO_THREADS |
96 | #if ECB_NO_THREADS |
97 | # define ECB_NO_SMP 1 |
97 | #define ECB_NO_SMP 1 |
98 | #endif |
98 | #endif |
99 | |
99 | |
100 | #if ECB_NO_SMP |
100 | #if ECB_NO_SMP |
101 | #define ECB_MEMORY_FENCE do { } while (0) |
101 | #define ECB_MEMORY_FENCE do { } while (0) |
102 | #endif |
102 | #endif |
… | |
… | |
145 | #elif defined __clang && __has_feature (cxx_atomic) |
145 | #elif defined __clang && __has_feature (cxx_atomic) |
146 | /* see above */ |
146 | /* see above */ |
147 | #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
147 | #define ECB_MEMORY_FENCE __c11_atomic_thread_fence (__ATOMIC_SEQ_CST) |
148 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
148 | #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__ |
149 | #define ECB_MEMORY_FENCE __sync_synchronize () |
149 | #define ECB_MEMORY_FENCE __sync_synchronize () |
150 | /*#define ECB_MEMORY_FENCE_ACQUIRE ({ char dummy = 0; __sync_lock_test_and_set (&dummy, 1); }) */ |
|
|
151 | /*#define ECB_MEMORY_FENCE_RELEASE ({ char dummy = 1; __sync_lock_release (&dummy ); }) */ |
|
|
152 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
150 | #elif _MSC_VER >= 1400 /* VC++ 2005 */ |
153 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
151 | #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier) |
154 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
152 | #define ECB_MEMORY_FENCE _ReadWriteBarrier () |
155 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
153 | #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */ |
156 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |
154 | #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier () |
… | |
… | |
173 | /* not just C11 atomics and atomic accesses */ |
171 | /* not just C11 atomics and atomic accesses */ |
174 | #include <stdatomic.h> |
172 | #include <stdatomic.h> |
175 | /* unfortunately, the C11 memory model seems to be very limited, and unable to express */ |
173 | /* unfortunately, the C11 memory model seems to be very limited, and unable to express */ |
176 | /* simple barrier semantics. That means we need to take out thor's hammer. */ |
174 | /* simple barrier semantics. That means we need to take out thor's hammer. */ |
177 | #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) |
175 | #define ECB_MEMORY_FENCE atomic_thread_fence (memory_order_seq_cst) |
178 | #endif |
|
|
179 | #endif |
176 | #endif |
180 | #endif |
177 | #endif |
181 | |
178 | |
182 | #ifndef ECB_MEMORY_FENCE |
179 | #ifndef ECB_MEMORY_FENCE |
183 | #if !ECB_AVOID_PTHREADS |
180 | #if !ECB_AVOID_PTHREADS |