Ticket #9193: atomic_dcas_win.patch

File atomic_dcas_win.patch, 2.9 KB (added by Gavin Lambert <boost@…>, 9 years ago)
  • detail/interlocked.hpp

     
    110110
    111111#else // defined(_M_AMD64)
    112112
     113#pragma intrinsic(_InterlockedCompareExchange64)
     114
    113115#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)_InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare)))
    114116#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)_InterlockedExchange((long*)(dest), (long)(newval)))
    115117#define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD_POINTER(dest, byte_offset) ((void*)BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD((long*)(dest), byte_offset))
     118
     119#define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE64(dest, exchange, compare) _InterlockedCompareExchange64((__int64*)(dest), (__int64)(exchange), (__int64)(compare))
    116120
    117121#endif // defined(_M_AMD64)
    118122
  • detail/windows.hpp

     
    737737    value_type
    738738    fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile
    739739    {
     740#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64)
    740741        platform_fence_before(order);
    741742        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&v_, v));
    742743        platform_fence_after(order);
    743744        return v;
     745#else
     746        value_type tmp = load(memory_order_relaxed);
     747        for (; !compare_exchange_weak(tmp, tmp + v, order, memory_order_relaxed);)
     748        {
     749            BOOST_ATOMIC_X86_PAUSE();
     750        }
     751        return tmp;
     752#endif
    744753    }
    745754
    746755    value_type
     
    753762    value_type
    754763    exchange(value_type v, memory_order order = memory_order_seq_cst) volatile
    755764    {
     765#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64)
    756766        platform_fence_before(order);
    757767        v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&v_, v));
    758768        platform_fence_after(order);
    759769        return v;
     770#else
     771        value_type tmp = load(memory_order_relaxed);
     772        for (; !compare_exchange_weak(tmp, v, order, memory_order_relaxed);)
     773        {
     774            BOOST_ATOMIC_X86_PAUSE();
     775        }
     776        return tmp;
     777#endif
    760778    }
    761779
    762780    bool
     
    13721390    value_type
    13731391    exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile
    13741392    {
     1393#if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64)
    13751394        storage_type tmp = 0;
    13761395        memcpy(&tmp, &v, sizeof(value_type));
    13771396        platform_fence_before(order);
     
    13801399        value_type res;
    13811400        memcpy(&res, &tmp, sizeof(value_type));
    13821401        return res;
     1402#else
     1403        value_type cur = load(memory_order_relaxed);
     1404        for (; !compare_exchange_weak(cur, v, order, memory_order_relaxed);)
     1405        {
     1406            BOOST_ATOMIC_X86_PAUSE();
     1407        }
     1408        return cur;
     1409#endif
    13831410    }
    13841411
    13851412    bool