sl@0: #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED sl@0: #define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED sl@0: sl@0: // MS compatible compilers support #pragma once sl@0: sl@0: #if defined(_MSC_VER) && (_MSC_VER >= 1020) sl@0: # pragma once sl@0: #endif sl@0: sl@0: // sl@0: // boost/detail/interlocked.hpp sl@0: // sl@0: // Copyright 2005 Peter Dimov sl@0: // sl@0: // Distributed under the Boost Software License, Version 1.0. (See sl@0: // accompanying file LICENSE_1_0.txt or copy at sl@0: // http://www.boost.org/LICENSE_1_0.txt) sl@0: // sl@0: sl@0: #include sl@0: sl@0: #if defined( BOOST_USE_WINDOWS_H ) sl@0: sl@0: # include sl@0: sl@0: # define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement sl@0: # define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer sl@0: # define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer sl@0: sl@0: #elif defined(_WIN32_WCE) sl@0: sl@0: // under Windows CE we still have old-style Interlocked* functions sl@0: sl@0: extern "C" long __cdecl InterlockedIncrement( long* ); sl@0: extern "C" long __cdecl InterlockedDecrement( long* ); sl@0: extern "C" long __cdecl InterlockedCompareExchange( long*, long, long ); sl@0: extern "C" long __cdecl InterlockedExchange( long*, long ); sl@0: extern "C" long __cdecl InterlockedExchangeAdd( long*, long ); sl@0: sl@0: # define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement sl@0: # define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd sl@0: sl@0: #elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN ) sl@0: sl@0: extern "C" long __cdecl _InterlockedIncrement( long volatile * ); sl@0: extern "C" long __cdecl _InterlockedDecrement( long volatile * ); sl@0: extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); sl@0: extern "C" long __cdecl _InterlockedExchange( long volatile *, long); sl@0: extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long); sl@0: sl@0: # pragma intrinsic( _InterlockedIncrement ) sl@0: # pragma intrinsic( _InterlockedDecrement ) sl@0: # pragma intrinsic( _InterlockedCompareExchange ) sl@0: # pragma intrinsic( _InterlockedExchange ) sl@0: # pragma intrinsic( _InterlockedExchangeAdd ) sl@0: sl@0: # if defined(_M_IA64) || defined(_M_AMD64) sl@0: sl@0: extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); sl@0: extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* ); sl@0: sl@0: # pragma intrinsic( _InterlockedCompareExchangePointer ) sl@0: # pragma intrinsic( _InterlockedExchangePointer ) sl@0: sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer sl@0: # define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer sl@0: sl@0: # else sl@0: sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ sl@0: ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) sl@0: # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ sl@0: ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) sl@0: sl@0: # endif sl@0: sl@0: # define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement sl@0: # define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd sl@0: sl@0: #elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) sl@0: sl@0: namespace boost sl@0: { sl@0: sl@0: namespace detail sl@0: { sl@0: sl@0: extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * ); sl@0: extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * ); sl@0: extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long ); sl@0: extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long ); sl@0: extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long ); sl@0: sl@0: } // namespace detail sl@0: sl@0: } // namespace boost sl@0: sl@0: # define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement sl@0: # define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange sl@0: # define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd sl@0: sl@0: # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ sl@0: ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) sl@0: # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ sl@0: ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) sl@0: sl@0: #else sl@0: sl@0: # error "Interlocked intrinsics not available" sl@0: sl@0: #endif sl@0: sl@0: #endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED