diff options
Diffstat (limited to 'src/corelib/arch')
-rw-r--r-- | src/corelib/arch/qatomic_bootstrap.h | 95 |
1 files changed, 37 insertions, 58 deletions
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 <thiago@kde.org> ** All rights reserved. ** Contact: http://www.qt-project.org/ ** @@ -42,76 +43,54 @@ #ifndef QATOMIC_BOOTSTRAP_H #define QATOMIC_BOOTSTRAP_H +#include <QtCore/qgenericatomic.h> + 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<int> { enum { IsInteger = 1 }; }; +template <typename T> struct QAtomicOps: QGenericAtomicOps<QAtomicOps<T> > { - 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; + } + static bool deref(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); -} + static bool testAndSetRelaxed(T &_q_value, T expectedValue, T newValue) + { + if (_q_value == expectedValue) { + _q_value = newValue; + return true; + } + return false; + } -template <typename T> -Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue) -{ - if (_q_value == expectedValue) { + static T fetchAndStoreRelaxed(T &_q_value, T newValue) + { + T tmp = _q_value; _q_value = newValue; - return true; + return tmp; + } + + static + T fetchAndAddRelaxed(T &_q_value, typename QAtomicAdditiveType<T>::AdditiveT valueToAdd) + { + T returnValue = _q_value; + _q_value += valueToAdd; + return returnValue; } - return false; -} +}; QT_END_NAMESPACE |