diff --git a/src/corelib/arch/qatomic_bootstrap.h b/src/corelib/arch/qatomic_bootstrap.h index 901611c592..4115b43444 100644 --- a/src/corelib/arch/qatomic_bootstrap.h +++ b/src/corelib/arch/qatomic_bootstrap.h @@ -1,6 +1,7 @@ /**************************************************************************** ** ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies). +** Copyright (C) 2011 Thiago Macieira ** All rights reserved. ** Contact: http://www.qt-project.org/ ** @@ -42,76 +43,54 @@ #ifndef QATOMIC_BOOTSTRAP_H #define QATOMIC_BOOTSTRAP_H +#include + QT_BEGIN_HEADER QT_BEGIN_NAMESPACE -inline bool QBasicAtomicInt::ref() -{ - return ++_q_value != 0; -} +#if 0 +#pragma qt_sync_stop_processing +#endif -inline bool QBasicAtomicInt::deref() +template<> struct QAtomicIntegerTraits { enum { IsInteger = 1 }; }; +template struct QAtomicOps: QGenericAtomicOps > { - return --_q_value != 0; -} + typedef T Type; -inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue) -{ - if (_q_value == expectedValue) { - _q_value = newValue; - return true; + static bool ref(T &_q_value) + { + return ++_q_value != 0; } - return false; -} - -inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue) -{ - return testAndSetOrdered(expectedValue, newValue); -} - -inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue) -{ - return testAndSetOrdered(expectedValue, newValue); -} - -inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue) -{ - return testAndSetOrdered(expectedValue, newValue); -} - -inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd) -{ - int returnValue = _q_value; - _q_value += valueToAdd; - return returnValue; -} - -inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd) -{ - return fetchAndAddOrdered(valueToAdd); -} - -inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd) -{ - return fetchAndAddOrdered(valueToAdd); -} - -inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd) -{ - return fetchAndAddOrdered(valueToAdd); -} - - -template -Q_INLINE_TEMPLATE bool QBasicAtomicPointer::testAndSetOrdered(T *expectedValue, T *newValue) -{ - if (_q_value == expectedValue) { - _q_value = newValue; - return true; + static bool deref(T &_q_value) + { + return --_q_value != 0; } - return false; -} + + static bool testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) + { + if (_q_value == expectedValue) { + _q_value = newValue; + return true; + } + return false; + } + + static T fetchAndStoreRelaxed(T &_q_value, T newValue) + { + T tmp = _q_value; + _q_value = newValue; + return tmp; + } + + static + T fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType::AdditiveT valueToAdd) + { + T returnValue = _q_value; + _q_value += valueToAdd; + return returnValue; + } +}; QT_END_NAMESPACE diff --git a/src/corelib/thread/qbasicatomic.h b/src/corelib/thread/qbasicatomic.h index 91df7501a0..fd32c55ed0 100644 --- a/src/corelib/thread/qbasicatomic.h +++ b/src/corelib/thread/qbasicatomic.h @@ -43,7 +43,11 @@ #include +#if defined(QT_MOC) || defined(QT_BUILD_QMAKE) || defined(QT_RCC) || defined(QT_UIC) || defined(QT_BOOTSTRAPPED) +# include +#else # define QT_OLD_ATOMICS +#endif #ifdef QT_OLD_ATOMICS # include "qoldbasicatomic.h" @@ -207,4 +211,5 @@ QT_END_HEADER #endif // QT_OLD_ATOMICS + #endif // QBASIC_ATOMIC diff --git a/src/corelib/thread/qoldbasicatomic.h b/src/corelib/thread/qoldbasicatomic.h index 0842bf5f4c..96feb2e491 100644 --- a/src/corelib/thread/qoldbasicatomic.h +++ b/src/corelib/thread/qoldbasicatomic.h @@ -171,10 +171,6 @@ public: QT_END_NAMESPACE QT_END_HEADER -#if defined(QT_MOC) || defined(QT_BUILD_QMAKE) || defined(QT_RCC) || defined(QT_UIC) || defined(QT_BOOTSTRAPPED) -# include -#else # include -#endif #endif // QBASIC_ATOMIC