Ticket #9193: atomic_dcas_win.patch
File atomic_dcas_win.patch, 2.9 KB (added by , 9 years ago) |
---|
-
detail/interlocked.hpp
110 110 111 111 #else // defined(_M_AMD64) 112 112 113 #pragma intrinsic(_InterlockedCompareExchange64) 114 113 115 #define BOOST_ATOMIC_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest, exchange, compare) ((void*)_InterlockedCompareExchange((long*)(dest), (long)(exchange), (long)(compare))) 114 116 #define BOOST_ATOMIC_INTERLOCKED_EXCHANGE_POINTER(dest, newval) ((void*)_InterlockedExchange((long*)(dest), (long)(newval))) 115 117 #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)) 116 120 117 121 #endif // defined(_M_AMD64) 118 122 -
detail/windows.hpp
737 737 value_type 738 738 fetch_add(value_type v, memory_order order = memory_order_seq_cst) volatile 739 739 { 740 #if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64) 740 741 platform_fence_before(order); 741 742 v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE_ADD64(&v_, v)); 742 743 platform_fence_after(order); 743 744 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 744 753 } 745 754 746 755 value_type … … 753 762 value_type 754 763 exchange(value_type v, memory_order order = memory_order_seq_cst) volatile 755 764 { 765 #if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64) 756 766 platform_fence_before(order); 757 767 v = static_cast< value_type >(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64(&v_, v)); 758 768 platform_fence_after(order); 759 769 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 760 778 } 761 779 762 780 bool … … 1372 1390 value_type 1373 1391 exchange(value_type const& v, memory_order order = memory_order_seq_cst) volatile 1374 1392 { 1393 #if defined(BOOST_ATOMIC_INTERLOCKED_EXCHANGE64) 1375 1394 storage_type tmp = 0; 1376 1395 memcpy(&tmp, &v, sizeof(value_type)); 1377 1396 platform_fence_before(order); … … 1380 1399 value_type res; 1381 1400 memcpy(&res, &tmp, sizeof(value_type)); 1382 1401 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 1383 1410 } 1384 1411 1385 1412 bool