#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 |