diff options
Diffstat (limited to 'boost/detail/interlocked.hpp')
-rw-r--r-- | boost/detail/interlocked.hpp | 91 |
1 files changed, 55 insertions, 36 deletions
diff --git a/boost/detail/interlocked.hpp b/boost/detail/interlocked.hpp index e20e3e4671..b746cccff1 100644 --- a/boost/detail/interlocked.hpp +++ b/boost/detail/interlocked.hpp @@ -5,6 +5,7 @@ // boost/detail/interlocked.hpp // // Copyright 2005 Peter Dimov +// Copyright 2018 Andrey Semashev // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at @@ -13,11 +14,40 @@ #include <boost/config.hpp> -// MS compatible compilers support #pragma once #ifdef BOOST_HAS_PRAGMA_ONCE #pragma once #endif +// BOOST_INTERLOCKED_HAS_INTRIN_H + +// VC9 has intrin.h, but it collides with <utility> +#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1600 + +# define BOOST_INTERLOCKED_HAS_INTRIN_H + +// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets. +#elif defined( __MINGW64_VERSION_MAJOR ) + +// MinGW-w64 provides intrin.h for both 32 and 64-bit targets. +# define BOOST_INTERLOCKED_HAS_INTRIN_H + +#elif defined( __CYGWIN__ ) && defined( __LP64__ ) + +// We have to use intrin.h on Cygwin 64 +# define BOOST_INTERLOCKED_HAS_INTRIN_H + +// Intel C++ on Windows on VC10+ stdlib +#elif defined( BOOST_INTEL_WIN ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520 + +# define BOOST_INTERLOCKED_HAS_INTRIN_H + +// clang-cl on Windows on VC10+ stdlib +#elif defined( __clang__ ) && defined( _MSC_VER ) && defined( _CPPLIB_VER ) && _CPPLIB_VER >= 520 + +# define BOOST_INTERLOCKED_HAS_INTRIN_H + +#endif + #if defined( BOOST_USE_WINDOWS_H ) # include <windows.h> @@ -30,7 +60,7 @@ # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer # define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer -#elif defined( BOOST_USE_INTRIN_H ) +#elif defined( BOOST_USE_INTRIN_H ) || defined( BOOST_INTERLOCKED_HAS_INTRIN_H ) #include <intrin.h> @@ -56,13 +86,29 @@ #elif defined(_WIN32_WCE) +#if _WIN32_WCE >= 0x600 + +extern "C" long __cdecl _InterlockedIncrement( long volatile * ); +extern "C" long __cdecl _InterlockedDecrement( long volatile * ); +extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long ); +extern "C" long __cdecl _InterlockedExchange( long volatile *, long ); +extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long ); + +# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement +# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement +# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange +# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange +# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd + +#else // _WIN32_WCE >= 0x600 + // under Windows CE we still have old-style Interlocked* functions -extern "C" long __cdecl InterlockedIncrement( long volatile* ); -extern "C" long __cdecl InterlockedDecrement( long volatile* ); -extern "C" long __cdecl InterlockedCompareExchange( long volatile*, long, long ); -extern "C" long __cdecl InterlockedExchange( long volatile*, long ); -extern "C" long __cdecl InterlockedExchangeAdd( long volatile*, long ); +extern "C" long __cdecl InterlockedIncrement( long * ); +extern "C" long __cdecl InterlockedDecrement( long * ); +extern "C" long __cdecl InterlockedCompareExchange( long *, long, long ); +extern "C" long __cdecl InterlockedExchange( long *, long ); +extern "C" long __cdecl InterlockedExchangeAdd( long *, long ); # define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement # define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement @@ -70,6 +116,8 @@ extern "C" long __cdecl InterlockedExchangeAdd( long volatile*, long ); # define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd +#endif // _WIN32_WCE >= 0x600 + # define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long*)(dest),(long)(exchange),(long)(compare))) # define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ @@ -77,12 +125,6 @@ extern "C" long __cdecl InterlockedExchangeAdd( long volatile*, long ); #elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN ) -#if defined( BOOST_MSVC ) && BOOST_MSVC >= 1400 - -#include <intrin.h> - -#else - # if defined( __CLRCALL_PURE_OR_CDECL ) # define BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL __CLRCALL_PURE_OR_CDECL # else @@ -105,8 +147,6 @@ extern "C" long BOOST_INTERLOCKED_CLRCALL_PURE_OR_CDECL _InterlockedExchangeAdd( # pragma intrinsic( _InterlockedExchangeAdd ) # endif -#endif - # if defined(_M_IA64) || defined(_M_AMD64) extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* ); @@ -130,27 +170,6 @@ extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* ); # define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange # define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd -// Unlike __MINGW64__, __MINGW64_VERSION_MAJOR is defined by MinGW-w64 for both 32 and 64-bit targets. -#elif defined(__MINGW64_VERSION_MAJOR) - -// MinGW-w64 provides intrin.h for both 32 and 64-bit targets. -#include <intrin.h> - -# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement -# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange -# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange -# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd -# if defined(__x86_64__) || defined(__x86_64) -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer -# define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer -# else -# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \ - ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare))) -# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \ - ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange))) -# endif - #elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ ) || defined( __CYGWIN__ ) #define BOOST_INTERLOCKED_IMPORT __declspec(dllimport) |