summaryrefslogtreecommitdiffstats
path: root/src/corelib/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/arch')
-rw-r--r--src/corelib/arch/qatomic_bootstrap.h95
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