os/ossrv/ossrv_pub/boost_apis/boost/detail/interlocked.hpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
#ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
sl@0
     2
#define BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED
sl@0
     3
sl@0
     4
// MS compatible compilers support #pragma once
sl@0
     5
sl@0
     6
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
sl@0
     7
# pragma once
sl@0
     8
#endif
sl@0
     9
sl@0
    10
//
sl@0
    11
//  boost/detail/interlocked.hpp
sl@0
    12
//
sl@0
    13
//  Copyright 2005 Peter Dimov
sl@0
    14
//
sl@0
    15
//  Distributed under the Boost Software License, Version 1.0. (See
sl@0
    16
//  accompanying file LICENSE_1_0.txt or copy at
sl@0
    17
//  http://www.boost.org/LICENSE_1_0.txt)
sl@0
    18
//
sl@0
    19
sl@0
    20
#include <boost/config.hpp>
sl@0
    21
sl@0
    22
#if defined( BOOST_USE_WINDOWS_H )
sl@0
    23
sl@0
    24
# include <windows.h>
sl@0
    25
sl@0
    26
# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement
sl@0
    27
# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
sl@0
    28
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
sl@0
    29
# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
sl@0
    30
# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
sl@0
    31
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER InterlockedCompareExchangePointer
sl@0
    32
# define BOOST_INTERLOCKED_EXCHANGE_POINTER InterlockedExchangePointer
sl@0
    33
sl@0
    34
#elif defined(_WIN32_WCE)
sl@0
    35
sl@0
    36
// under Windows CE we still have old-style Interlocked* functions
sl@0
    37
sl@0
    38
extern "C" long __cdecl InterlockedIncrement( long* );
sl@0
    39
extern "C" long __cdecl InterlockedDecrement( long* );
sl@0
    40
extern "C" long __cdecl InterlockedCompareExchange( long*, long, long );
sl@0
    41
extern "C" long __cdecl InterlockedExchange( long*, long );
sl@0
    42
extern "C" long __cdecl InterlockedExchangeAdd( long*, long );
sl@0
    43
sl@0
    44
# define BOOST_INTERLOCKED_INCREMENT InterlockedIncrement
sl@0
    45
# define BOOST_INTERLOCKED_DECREMENT InterlockedDecrement
sl@0
    46
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE InterlockedCompareExchange
sl@0
    47
# define BOOST_INTERLOCKED_EXCHANGE InterlockedExchange
sl@0
    48
# define BOOST_INTERLOCKED_EXCHANGE_ADD InterlockedExchangeAdd
sl@0
    49
sl@0
    50
#elif defined( BOOST_MSVC ) || defined( BOOST_INTEL_WIN )
sl@0
    51
sl@0
    52
extern "C" long __cdecl _InterlockedIncrement( long volatile * );
sl@0
    53
extern "C" long __cdecl _InterlockedDecrement( long volatile * );
sl@0
    54
extern "C" long __cdecl _InterlockedCompareExchange( long volatile *, long, long );
sl@0
    55
extern "C" long __cdecl _InterlockedExchange( long volatile *, long);
sl@0
    56
extern "C" long __cdecl _InterlockedExchangeAdd( long volatile *, long);
sl@0
    57
sl@0
    58
# pragma intrinsic( _InterlockedIncrement )
sl@0
    59
# pragma intrinsic( _InterlockedDecrement )
sl@0
    60
# pragma intrinsic( _InterlockedCompareExchange )
sl@0
    61
# pragma intrinsic( _InterlockedExchange )
sl@0
    62
# pragma intrinsic( _InterlockedExchangeAdd )
sl@0
    63
sl@0
    64
# if defined(_M_IA64) || defined(_M_AMD64)
sl@0
    65
sl@0
    66
extern "C" void* __cdecl _InterlockedCompareExchangePointer( void* volatile *, void*, void* );
sl@0
    67
extern "C" void* __cdecl _InterlockedExchangePointer( void* volatile *, void* );
sl@0
    68
sl@0
    69
#  pragma intrinsic( _InterlockedCompareExchangePointer )
sl@0
    70
#  pragma intrinsic( _InterlockedExchangePointer )
sl@0
    71
sl@0
    72
#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER _InterlockedCompareExchangePointer
sl@0
    73
#  define BOOST_INTERLOCKED_EXCHANGE_POINTER _InterlockedExchangePointer
sl@0
    74
sl@0
    75
# else
sl@0
    76
sl@0
    77
#  define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
sl@0
    78
    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
sl@0
    79
#  define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
sl@0
    80
    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
sl@0
    81
sl@0
    82
# endif
sl@0
    83
sl@0
    84
# define BOOST_INTERLOCKED_INCREMENT _InterlockedIncrement
sl@0
    85
# define BOOST_INTERLOCKED_DECREMENT _InterlockedDecrement
sl@0
    86
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE _InterlockedCompareExchange
sl@0
    87
# define BOOST_INTERLOCKED_EXCHANGE _InterlockedExchange
sl@0
    88
# define BOOST_INTERLOCKED_EXCHANGE_ADD _InterlockedExchangeAdd
sl@0
    89
sl@0
    90
#elif defined( WIN32 ) || defined( _WIN32 ) || defined( __WIN32__ )
sl@0
    91
sl@0
    92
namespace boost
sl@0
    93
{
sl@0
    94
sl@0
    95
namespace detail
sl@0
    96
{
sl@0
    97
sl@0
    98
extern "C" __declspec(dllimport) long __stdcall InterlockedIncrement( long volatile * );
sl@0
    99
extern "C" __declspec(dllimport) long __stdcall InterlockedDecrement( long volatile * );
sl@0
   100
extern "C" __declspec(dllimport) long __stdcall InterlockedCompareExchange( long volatile *, long, long );
sl@0
   101
extern "C" __declspec(dllimport) long __stdcall InterlockedExchange( long volatile *, long );
sl@0
   102
extern "C" __declspec(dllimport) long __stdcall InterlockedExchangeAdd( long volatile *, long );
sl@0
   103
sl@0
   104
} // namespace detail
sl@0
   105
sl@0
   106
} // namespace boost
sl@0
   107
sl@0
   108
# define BOOST_INTERLOCKED_INCREMENT ::boost::detail::InterlockedIncrement
sl@0
   109
# define BOOST_INTERLOCKED_DECREMENT ::boost::detail::InterlockedDecrement
sl@0
   110
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE ::boost::detail::InterlockedCompareExchange
sl@0
   111
# define BOOST_INTERLOCKED_EXCHANGE ::boost::detail::InterlockedExchange
sl@0
   112
# define BOOST_INTERLOCKED_EXCHANGE_ADD ::boost::detail::InterlockedExchangeAdd
sl@0
   113
sl@0
   114
# define BOOST_INTERLOCKED_COMPARE_EXCHANGE_POINTER(dest,exchange,compare) \
sl@0
   115
    ((void*)BOOST_INTERLOCKED_COMPARE_EXCHANGE((long volatile*)(dest),(long)(exchange),(long)(compare)))
sl@0
   116
# define BOOST_INTERLOCKED_EXCHANGE_POINTER(dest,exchange) \
sl@0
   117
    ((void*)BOOST_INTERLOCKED_EXCHANGE((long volatile*)(dest),(long)(exchange)))
sl@0
   118
sl@0
   119
#else
sl@0
   120
sl@0
   121
# error "Interlocked intrinsics not available"
sl@0
   122
sl@0
   123
#endif
sl@0
   124
sl@0
   125
#endif // #ifndef BOOST_DETAIL_INTERLOCKED_HPP_INCLUDED