Move the non-atomic and implicit functions from QBasicAtomicXXX

Now, users of QBasicAtomicInt and QBasicAtomicPointer must be sure to
use .load() and .store() to access the values.

Change-Id: I6b48ed175618baf387dd38d821bd50e6e93c082e
Reviewed-by: Bradley T. Hughes <bradley.hughes@nokia.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
This commit is contained in:
Thiago Macieira 2011-07-05 23:52:29 +02:00 committed by Qt by Nokia
parent e4b145d11c
commit c7f8213bc5
3 changed files with 66 additions and 85 deletions

View File

@ -39,10 +39,11 @@
** **
****************************************************************************/ ****************************************************************************/
#include <QtCore/qglobal.h>
#ifndef QATOMIC_H #ifndef QATOMIC_H
#define QATOMIC_H #define QATOMIC_H
#include <QtCore/qglobal.h>
#include <QtCore/qbasicatomic.h> #include <QtCore/qbasicatomic.h>
QT_BEGIN_HEADER QT_BEGIN_HEADER
@ -51,10 +52,16 @@ QT_BEGIN_NAMESPACE
QT_MODULE(Core) QT_MODULE(Core)
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wextra"
#endif
// High-level atomic integer operations // High-level atomic integer operations
class Q_CORE_EXPORT QAtomicInt : public QBasicAtomicInt class Q_CORE_EXPORT QAtomicInt : public QBasicAtomicInt
{ {
public: public:
// Non-atomic API
inline QAtomicInt(int value = 0) inline QAtomicInt(int value = 0)
{ {
#ifdef QT_ARCH_PARISC #ifdef QT_ARCH_PARISC
@ -62,32 +69,48 @@ public:
#endif #endif
_q_value = value; _q_value = value;
} }
inline QAtomicInt(const QAtomicInt &other) inline QAtomicInt(const QAtomicInt &other)
{ {
#ifdef QT_ARCH_PARISC #ifdef QT_ARCH_PARISC
this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1; this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
#endif #endif
_q_value = other._q_value; store(other.load());
} }
inline QAtomicInt &operator=(int value) inline QAtomicInt &operator=(int value)
{ {
(void) QBasicAtomicInt::operator=(value); this->store(value);
return *this; return *this;
} }
inline QAtomicInt &operator=(const QAtomicInt &other) inline QAtomicInt &operator=(const QAtomicInt &other)
{ {
(void) QBasicAtomicInt::operator=(other); this->store(other.load());
return *this; return *this;
} }
#ifdef qdoc inline bool operator==(int value) const
bool operator==(int value) const; {
bool operator!=(int value) const; return this->load() == value;
bool operator!() const; }
operator int() const;
inline bool operator!=(int value) const
{
return this->load() != value;
}
inline operator int() const
{
return this->load();
}
inline bool operator!() const
{
return !this->load();
}
#ifdef qdoc
static bool isReferenceCountingNative(); static bool isReferenceCountingNative();
static bool isReferenceCountingWaitFree(); static bool isReferenceCountingWaitFree();
@ -130,35 +153,54 @@ public:
#ifdef QT_ARCH_PARISC #ifdef QT_ARCH_PARISC
this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1; this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
#endif #endif
QBasicAtomicPointer<T>::_q_value = value; store(value);
} }
inline QAtomicPointer(const QAtomicPointer<T> &other) inline QAtomicPointer(const QAtomicPointer<T> &other)
{ {
#ifdef QT_ARCH_PARISC #ifdef QT_ARCH_PARISC
this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1; this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
#endif #endif
QBasicAtomicPointer<T>::_q_value = other._q_value; store(other.load());
} }
inline QAtomicPointer<T> &operator=(T *value) inline QAtomicPointer<T> &operator=(T *value)
{ {
(void) QBasicAtomicPointer<T>::operator=(value); this->store(value);
return *this; return *this;
} }
inline QAtomicPointer<T> &operator=(const QAtomicPointer<T> &other) inline QAtomicPointer<T> &operator=(const QAtomicPointer<T> &other)
{ {
(void) QBasicAtomicPointer<T>::operator=(other); this->store(other.load());
return *this; return *this;
} }
#ifdef qdoc inline bool operator==(T *value) const
bool operator==(T *value) const; {
bool operator!=(T *value) const; return this->load() == value;
bool operator!() const; }
operator T *() const;
T *operator->() const;
inline bool operator!=(T *value) const
{
return this->load() != value;
}
inline bool operator!() const
{
return !this->load();
}
inline operator T *() const
{
return this->load();
}
inline T *operator->() const
{
return this->load();
}
#ifdef qdoc
static bool isTestAndSetNative(); static bool isTestAndSetNative();
static bool isTestAndSetWaitFree(); static bool isTestAndSetWaitFree();
@ -185,6 +227,10 @@ public:
#endif #endif
}; };
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 406)
# pragma GCC diagnostic pop
#endif
/*! /*!
This is a helper for the assignment operators of implicitly This is a helper for the assignment operators of implicitly
shared classes. Your assignment operator should look like this: shared classes. Your assignment operator should look like this:

View File

@ -64,36 +64,6 @@ public:
volatile int _q_value; volatile int _q_value;
#endif #endif
// Non-atomic API
inline bool operator==(int value) const
{
return _q_value == value;
}
inline bool operator!=(int value) const
{
return _q_value != value;
}
inline bool operator!() const
{
return _q_value == 0;
}
inline operator int() const
{
return _q_value;
}
inline QBasicAtomicInt &operator=(int value)
{
#ifdef QT_ARCH_PARISC
this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
#endif
_q_value = value;
return *this;
}
// Atomic API, implemented in qatomic_XXX.h // Atomic API, implemented in qatomic_XXX.h
int load() const { return _q_value; } int load() const { return _q_value; }
@ -153,41 +123,6 @@ public:
T * volatile _q_value; T * volatile _q_value;
#endif #endif
// Non-atomic API
inline bool operator==(T *value) const
{
return _q_value == value;
}
inline bool operator!=(T *value) const
{
return !operator==(value);
}
inline bool operator!() const
{
return operator==(0);
}
inline operator T *() const
{
return _q_value;
}
inline T *operator->() const
{
return _q_value;
}
inline QBasicAtomicPointer<T> &operator=(T *value)
{
#ifdef QT_ARCH_PARISC
this->_q_lock[0] = this->_q_lock[1] = this->_q_lock[2] = this->_q_lock[3] = -1;
#endif
_q_value = value;
return *this;
}
// Atomic API, implemented in qatomic_XXX.h // Atomic API, implemented in qatomic_XXX.h
T *load() const { return _q_value; } T *load() const { return _q_value; }

View File

@ -363,7 +363,7 @@ void tst_QSqlThread::cleanupTestCase()
void tst_QSqlThread::init() void tst_QSqlThread::init()
{ {
threadFinishedCount = 0; threadFinishedCount = 0;
counter = 4; counter.store(4);
} }
void tst_QSqlThread::cleanup() void tst_QSqlThread::cleanup()