Port the bootstrap atomics to the new QBasicAtomic architecture

The code is now much simpler and much more complete. Now the bootstrap
atomics (which aren't atomic at all) contain the full set of
operations.

The only integer supported is int, but all others would work too.

Change-Id: Id99f07818f9da059c4ff02520f9cbf2d1a71a514
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
Thiago Macieira 2011-07-31 18:25:24 -03:00 committed by Qt by Nokia
parent 1831abb5bb
commit 161d5eb323
3 changed files with 45 additions and 65 deletions

View File

@ -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;
}
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 <typename T>
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::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<T>::AdditiveT valueToAdd)
{
T returnValue = _q_value;
_q_value += valueToAdd;
return returnValue;
}
};
QT_END_NAMESPACE

View File

@ -43,7 +43,11 @@
#include <QtCore/qglobal.h>
#if defined(QT_MOC) || defined(QT_BUILD_QMAKE) || defined(QT_RCC) || defined(QT_UIC) || defined(QT_BOOTSTRAPPED)
# include <QtCore/qatomic_bootstrap.h>
#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

View File

@ -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 <QtCore/qatomic_bootstrap.h>
#else
# include <QtCore/qatomic_arch.h>
#endif
#endif // QBASIC_ATOMIC