| #ifndef BOOST_THREAD_DETAIL_INTERLOCKED_READ_WIN32_HPP |
| #define BOOST_THREAD_DETAIL_INTERLOCKED_READ_WIN32_HPP |
| |
| // interlocked_read_win32.hpp |
| // |
| // (C) Copyright 2005-8 Anthony Williams |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See |
| // accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| #include <boost/detail/interlocked.hpp> |
| |
| #include <boost/config/abi_prefix.hpp> |
| |
| #ifdef BOOST_MSVC |
| |
| extern "C" void _ReadWriteBarrier(void); |
| #pragma intrinsic(_ReadWriteBarrier) |
| |
| namespace boost |
| { |
| namespace detail |
| { |
| inline long interlocked_read_acquire(long volatile* x) |
| { |
| long const res=*x; |
| _ReadWriteBarrier(); |
| return res; |
| } |
| inline void* interlocked_read_acquire(void* volatile* x) |
| { |
| void* const res=*x; |
| _ReadWriteBarrier(); |
| return res; |
| } |
| |
| inline void interlocked_write_release(long volatile* x,long value) |
| { |
| _ReadWriteBarrier(); |
| *x=value; |
| } |
| inline void interlocked_write_release(void* volatile* x,void* value) |
| { |
| _ReadWriteBarrier(); |
| *x=value; |
| } |
| } |
| } |
| |
| #else |
| |
| namespace boost |
| { |
| namespace detail |
| { |
| inline long interlocked_read_acquire(long volatile* x) |
| { |
| return BOOST_INTERLOCKED_COMPARE_EXCHANGE(x,0,0); |
| } |
| inline void* interlocked_read_acquire(void* volatile* x) |
| { |
| return BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(x,0,0); |
| } |
| inline void interlocked_write_release(long volatile* x,long value) |
| { |
| BOOST_INTERLOCKED_EXCHANGE(x,value); |
| } |
| inline void interlocked_write_release(void* volatile* x,void* value) |
| { |
| BOOST_INTERLOCKED_EXCHANGE_POINTER(x,value); |
| } |
| } |
| } |
| |
| #endif |
| |
| #include <boost/config/abi_suffix.hpp> |
| |
| #endif |