|
|
|
@ -102,12 +102,16 @@
|
|
|
|
|
* \param name the atomic variable
|
|
|
|
|
* \param val the value to add to the variable
|
|
|
|
|
*/
|
|
|
|
|
#define SC_ATOMIC_ADD(name, val) \
|
|
|
|
|
#define SC_ATOMIC_ADD(name, val) ({\
|
|
|
|
|
typeof(name ## _sc_atomic__) var; \
|
|
|
|
|
do { \
|
|
|
|
|
SCSpinLock(&(name ## _sc_lock__)); \
|
|
|
|
|
(name ## _sc_atomic__) += (val); \
|
|
|
|
|
var = (name ## _sc_atomic__); \
|
|
|
|
|
SCSpinUnlock(&(name ## _sc_lock__)); \
|
|
|
|
|
} while(0)
|
|
|
|
|
} while(0); \
|
|
|
|
|
var ; \
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief sub a value from our atomic variable
|
|
|
|
@ -115,12 +119,16 @@
|
|
|
|
|
* \param name the atomic variable
|
|
|
|
|
* \param val the value to sub from the variable
|
|
|
|
|
*/
|
|
|
|
|
#define SC_ATOMIC_SUB(name, val) \
|
|
|
|
|
#define SC_ATOMIC_SUB(name, val) ({ \
|
|
|
|
|
typeof(name ## _sc_atomic__) var; \
|
|
|
|
|
do { \
|
|
|
|
|
SCSpinLock(&(name ## _sc_lock__)); \
|
|
|
|
|
(name ## _sc_atomic__) -= (val); \
|
|
|
|
|
var = (name ## _sc_atomic__); \
|
|
|
|
|
SCSpinUnlock(&(name ## _sc_lock__)); \
|
|
|
|
|
} while(0)
|
|
|
|
|
} while(0); \
|
|
|
|
|
var ; \
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Bitwise AND a value from our atomic variable
|
|
|
|
@ -243,6 +251,28 @@
|
|
|
|
|
#define SCAtomicFetchAndSub(addr, value) \
|
|
|
|
|
__sync_fetch_and_sub((addr), (value))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief wrapper for OS/compiler specific atomic fetch and add
|
|
|
|
|
* function.
|
|
|
|
|
*
|
|
|
|
|
* \param addr Address of the variable to add to
|
|
|
|
|
* \param value Value to add to the variable at addr
|
|
|
|
|
*/
|
|
|
|
|
#define SCAtomicAddAndFetch(addr, value) \
|
|
|
|
|
__sync_add_and_fetch((addr), (value))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief wrapper for OS/compiler specific atomic fetch and sub
|
|
|
|
|
* function.
|
|
|
|
|
*
|
|
|
|
|
* \param addr Address of the variable to add to
|
|
|
|
|
* \param value Value to sub from the variable at addr
|
|
|
|
|
*/
|
|
|
|
|
#define SCAtomicSubAndFetch(addr, value) \
|
|
|
|
|
__sync_sub_and_fetch((addr), (value))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief wrapper for OS/compiler specific atomic fetch and "AND"
|
|
|
|
|
* function.
|
|
|
|
@ -347,7 +377,7 @@
|
|
|
|
|
* \param val the value to add to the variable
|
|
|
|
|
*/
|
|
|
|
|
#define SC_ATOMIC_ADD(name, val) \
|
|
|
|
|
SCAtomicFetchAndAdd(&(name ## _sc_atomic__), (val))
|
|
|
|
|
SCAtomicAddAndFetch(&(name ## _sc_atomic__), (val))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief sub a value from our atomic variable
|
|
|
|
@ -356,7 +386,7 @@
|
|
|
|
|
* \param val the value to sub from the variable
|
|
|
|
|
*/
|
|
|
|
|
#define SC_ATOMIC_SUB(name, val) \
|
|
|
|
|
SCAtomicFetchAndSub(&(name ## _sc_atomic__), (val))
|
|
|
|
|
SCAtomicSubAndFetch(&(name ## _sc_atomic__), (val))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \brief Bitwise OR a value to our atomic variable
|
|
|
|
|