--- detail/interlocked.hpp Tue Jan 20 11:26:36 1970 +++ detail/interlocked.hpp Tue Jan 20 11:26:36 1970 @@ -110,9 +110,13 @@ #else // defined(_M_AMD64) +#pragma intrinsic(_InterlockedCompareExchange64) + #define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)_InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare))) #define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)_InterlockedExchange((long*)(dest), (long)(newval))) #define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD((long*)(dest), byte_offset)) + +#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare)) #endif // defined(_M_AMD64) --- detail/windows.hpp Tue Jan 20 11:26:36 1970 +++ detail/windows.hpp Tue Jan 20 11:26:36 1970 @@ -737,10 +737,19 @@ value_type fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile { +#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64) platform_fence_before(order); v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&v_, v)); platform_fence_after(order); return v; +#else + value_type tmp = load(memory_order_relaxed); + for (; !compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed);) + { + BOOST_ATOMIC_X86_PAUSE(); + } + return tmp; +#endif } value_type @@ -753,10 +762,19 @@ value_type exchange(value_type v, memory_order order = memory_order_seq_cst) volatile { +#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64) platform_fence_before(order); v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&v_, v)); platform_fence_after(order); return v; +#else + value_type tmp = load(memory_order_relaxed); + for (; !compare_exchange_weak(tmp, v, order, memory_order_relaxed);) + { + BOOST_ATOMIC_X86_PAUSE(); + } + return tmp; +#endif } bool @@ -1372,6 +1390,7 @@ value_type exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile { +#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64) storage_type tmp = 0; memcpy(&tmp, &v, sizeof(value_type)); platform_fence_before(order); @@ -1380,6 +1399,14 @@ value_type res; memcpy(&res, &tmp, sizeof(value_type)); return res; +#else + value_type cur = load(memory_order_relaxed); + for (; !compare_exchange_weak(cur, v, order, memory_order_relaxed);) + { + BOOST_ATOMIC_X86_PAUSE(); + } + return cur; +#endif } bool