16 extern "C" long __cdecl _InterlockedIncrement(
long volatile *);
17 extern "C" long __cdecl _InterlockedDecrement(
long volatile *);
19 #pragma intrinsic(_InterlockedIncrement)
20 #pragma intrinsic(_InterlockedDecrement)
24 #include <boost/atomic.hpp>
25 #include <qi/config.hpp>
38 return __sync_bool_compare_and_swap(cond, 0, 1);
39 #elif defined _MSC_VER
40 return 1 - InterlockedCompareExchange(cond, 1, 0);
42 #error "Unknown platform, testAndSet not implemented"
66 inline bool setIfEquals(
int testValue,
int setValue);
68 inline int swap(
int value);
88 return __sync_add_and_fetch(&
_value, 1);
92 return __sync_sub_and_fetch(&
_value, 1);
96 __sync_lock_test_and_set(&
_value, value);
101 return __sync_lock_test_and_set(&
_value, value);
105 return __sync_bool_compare_and_swap(&
_value, testValue, setValue);
107 #elif defined(_MSC_VER)
110 return _InterlockedIncrement(&
_value);
114 return _InterlockedDecrement(&
_value);
118 InterlockedExchange(&
_value, value);
123 return InterlockedExchange(&
_value, value);
127 return _InterlockedCompareExchange(&
_value, setValue, testValue) == testValue;
139 template <
typename T>
171 {
_value = value;
return *
this; }
173 {
_value = *value;
return *
this; }
179 {
return _value.compare_exchange_strong(testValue, setValue); }
185 {
return _value.exchange(value); }
203 #define _QI_INSTANCIATE(_, a, elem) ::qi::detail::newAndAssign(&elem);
252 #define QI_THREADSAFE_NEW(...) \
253 QI_ONCE(QI_VAARGS_APPLY(_QI_INSTANCIATE, _, __VA_ARGS__);)
298 #define QI_ONCE(code) \
299 static qi::detail::StaticAtomicInt QI_UNIQ_DEF(atomic_guard_a) = {0}; \
300 static qi::detail::StaticAtomicInt QI_UNIQ_DEF(atomic_guard_b) = {0}; \
301 while (!QI_UNIQ_DEF(atomic_guard_a).setIfEquals(1, 1)) \
303 bool tok = QI_UNIQ_DEF(atomic_guard_b).setIfEquals(0, 1); \
307 ++QI_UNIQ_DEF(atomic_guard_a); \
311 #endif // QI_ATOMIC_HPP_
T operator--()
Atomic decement of the value.
bool setIfEquals(T testValue, T setValue)
bool setIfEquals(int testValue, int setValue)
Atomic< T > & operator=(T value)
StaticAtomicInt & operator=(int value)
long testAndSet(long *cond)
boost::atomic< T > _value
Atomic(const Atomic &other)
void newAndAssign(T **ptr)
T operator++()
Atomic increment of the value.
Atomic< T > & operator=(const Atomic< T > &value)
Various macros for qi. (deprecated, export API, disallow copy, ..) <includename>qi/macro.hpp</includename> .