16 extern "C" long __cdecl _InterlockedIncrement(
long volatile *);
17 extern "C" long __cdecl _InterlockedDecrement(
long volatile *);
19 #pragma intrinsic(_InterlockedIncrement)
20 #pragma intrinsic(_InterlockedDecrement)
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"
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;
142 template <
typename T>
156 :
_value(std::move(value))
184 {
_value = std::move(value);
return *
this; }
192 {
return _value.compare_exchange_strong(testValue, setValue); }
198 {
return _value.exchange(value); }
222 #define _QI_INSTANCIATE(_, a, elem) ::qi::detail::newAndAssign(&elem);
271 #define QI_THREADSAFE_NEW(...) \
272 QI_ONCE(QI_VAARGS_APPLY(_QI_INSTANCIATE, _, __VA_ARGS__);)
317 #define QI_ONCE(code) \
318 static qi::detail::StaticAtomicInt QI_UNIQ_DEF(atomic_guard_a) = {0}; \
319 static qi::detail::StaticAtomicInt QI_UNIQ_DEF(atomic_guard_b) = {0}; \
320 while (!QI_UNIQ_DEF(atomic_guard_a).setIfEquals(1, 1)) \
322 bool tok = QI_UNIQ_DEF(atomic_guard_b).setIfEquals(0, 1); \
331 QI_UNIQ_DEF(atomic_guard_b) = 0; \
334 ++QI_UNIQ_DEF(atomic_guard_a); \
338 #endif // QI_ATOMIC_HPP_
void setValue(qi::Promise< R > &p, const boost::function< R()> &f)
T operator--()
Atomic pre-decrement 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)
Atomic(const Atomic &other)
void newAndAssign(T **ptr)
T operator++()
Atomic pre-increment of the value.
T operator++(int)
Atomic post-increment of the value.
#define QI_API_DEPRECATED_MSG(msg__)
Compiler flags to mark a function as deprecated. It will generate a compiler warning.
Atomic< T > & operator=(const Atomic< T > &value)
T operator--(int)
Atomic post-decrement of the value.
Various macros for qi. (deprecated, export API, disallow copy, ..) <includename>qi/macro.hpp</includename> .