2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-02-15 00:12:09 +00:00

atomic: 64bit cas support for 32bit windows

fixes #9193

[SVN r86144]
This commit is contained in:
Tim Blechmann
2013-10-03 09:17:42 +00:00
parent 21fc47f109
commit 9606e3f321
2 changed files with 31 additions and 0 deletions

View File

@@ -107,10 +107,14 @@
#else // defined(_M_AMD64) || defined(_M_IA64)
#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) || defined(_M_IA64)
#else // defined(_MSC_VER) && _MSC_VER >= 1400

View File

@@ -1310,10 +1310,19 @@ public:
value_type
fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
#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
@@ -1326,10 +1335,19 @@ public:
value_type
exchange(value_type v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
#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
@@ -1474,6 +1492,7 @@ public:
value_type
exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile BOOST_NOEXCEPT
{
#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64)
storage_type tmp = 0;
memcpy(&tmp, &v, sizeof(value_type));
platform_fence_before(order);
@@ -1482,6 +1501,14 @@ public:
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