15 #ifndef LUNCHBOX_ATOMIC_H 
   16 #define LUNCHBOX_ATOMIC_H 
   19 #include <lunchbox/compiler.h>        
   23 #  pragma warning (push) 
   24 #  pragma warning (disable: 4985) // inconsistent decl of ceil 
   27 #  pragma warning (pop) 
   28 #  pragma intrinsic(_ReadWriteBarrier) 
   29 #elif defined(__xlC__) 
   30 #  include <builtins.h> 
   40 #ifdef LB_GCC_4_1_OR_LATER 
   42 #elif defined(_MSC_VER) 
   44 #elif defined(__xlC__) 
   49 #  error "no memory barrier implemented for this platform" 
   91     LUNCHBOX_API 
static T 
getAndAdd( T& value, 
const T increment );
 
   94     LUNCHBOX_API 
static T 
getAndSub( T& value, 
const T increment );
 
   97     static T 
addAndGet( T& value, 
const T increment );
 
  100     static T 
subAndGet( T& value, 
const T increment );
 
  103     LUNCHBOX_API 
static T 
incAndGet( T& value );
 
  106     LUNCHBOX_API 
static T 
decAndGet( T& value );
 
  109     LUNCHBOX_API 
static bool compareAndSwap( T* value, 
const T expected,
 
  113     explicit Atomic( 
const T v = 0 );
 
  119     operator T(
void) 
const;
 
  166     LB_ALIGN8( 
mutable T _value );
 
  171 #ifdef LB_GCC_4_1_OR_LATER 
  174     return __sync_fetch_and_add( &value, increment );
 
  179     return __sync_fetch_and_sub( &value, increment );
 
  184     return __sync_add_and_fetch( &value, increment );
 
  189     return __sync_sub_and_fetch( &value, increment );
 
  194     return addAndGet( value, 1 );
 
  199     return subAndGet( value, 1 );
 
  205     return __sync_bool_compare_and_swap( value, expected, newValue );
 
  208 #elif defined (_MSC_VER) 
  213     return getAndAdd( value, increment ) + increment;
 
  218     return getAndSub( value, increment ) - increment;
 
  226     return __compare_and_swap( value, const_cast< T* >( &expected ), newValue );
 
  231                                         const int64_t newValue )
 
  233     return __compare_and_swaplp( value, const_cast< int64_t* >( &expected ),
 
  238 #    error No compare-and-swap implementated for this platform 
  246         const T oldv = value;
 
  247         const T newv = oldv + increment;
 
  248         if( !compareAndSwap( &value, oldv, newv ))
 
  261         const T oldv = value;
 
  262         const T newv = oldv - increment;
 
  263         if( !compareAndSwap( &value, oldv, newv ))
 
  276         const T oldv = value;
 
  277         const T newv = oldv + increment;
 
  291         const T oldv = value;
 
  292         const T newv = oldv - increment;
 
  303     return addAndGet( value, 1 );
 
  308     return subAndGet( value, 1 );
 
  338     return addAndGet( _value, v );
 
  343     return subAndGet( _value, v );
 
  348     return incAndGet( _value );
 
  353     return decAndGet( _value );
 
  358     return getAndAdd( _value, 1 );
 
  363     return getAndSub( _value, 1 );
 
  369     return _value == rhs._value;
 
  375     return _value != rhs._value;
 
  381     return compareAndSwap( &_value, expected, newValue );
 
  385 #endif  // LUNCHBOX_ATOMIC_H 
static LUNCHBOX_API T decAndGet(T &value)
 
static LUNCHBOX_API T getAndSub(T &value, const T increment)
 
A variable with atomic semantics and standalone atomic operations. 
 
Defines export visibility macros for Lunchbox. 
 
Basic type definitions not provided by the operating system. 
 
void memoryBarrierRelease()
Perform a store-with-release memory barrier. 
 
static LUNCHBOX_API T getAndAdd(T &value, const T increment)
 
static T addAndGet(T &value, const T increment)
 
static LUNCHBOX_API T incAndGet(T &value)
 
bool operator!=(const Atomic< T > &rhs) const 
 
T operator--(void)
Atomically decrement by one and return the new value. 
 
static T subAndGet(T &value, const T increment)
 
void memoryBarrier()
Perform a full memory barrier. 
 
bool operator==(const Atomic< T > &rhs) const 
 
void operator=(const T v)
Assign a new value. 
 
T operator+=(T v)
Atomically add a value and return the new value. 
 
Atomic(const T v=0)
Construct a new atomic variable with an initial value. 
 
void memoryBarrierAcquire()
Perform a load-with-acquire memory barrier. 
 
T operator-=(T v)
Atomically substract a value and return the new value. 
 
T operator++(void)
Atomically increment by one and return the new value. 
 
static LUNCHBOX_API bool compareAndSwap(T *value, const T expected, const T newValue)
Perform a compare-and-swap atomic operation.