Remove the generic atomic implementation
This implementation is not used on Windows, and needs to be updated on UNIX for processors that we do not support (this will be done in a separate commit). Change-Id: I471d0ed00f4e8b89ecfa400796a2dbe2330935c6 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
f748875fa8
commit
df4746db04
@ -1,12 +1,10 @@
|
||||
win32:HEADERS += arch/qatomic_msvc.h \
|
||||
arch/qatomic_generic.h
|
||||
win32:HEADERS += arch/qatomic_msvc.h
|
||||
|
||||
win32-g++*:HEADERS += arch/qatomic_i386.h \
|
||||
arch/qatomic_x86_64.h
|
||||
|
||||
mac:HEADERS += arch/qatomic_i386.h \
|
||||
arch/qatomic_x86_64.h \
|
||||
arch/qatomic_generic.h
|
||||
arch/qatomic_x86_64.h
|
||||
|
||||
vxworks:HEADERS += arch/qatomic_vxworks.h
|
||||
|
||||
@ -16,7 +14,6 @@ integrity:HEADERS += arch/qatomic_integrity.h
|
||||
arch/qatomic_ia64.h \
|
||||
arch/qatomic_sparc.h \
|
||||
arch/qatomic_arch.h \
|
||||
arch/qatomic_generic.h \
|
||||
arch/qatomic_powerpc.h \
|
||||
arch/qatomic_armv5.h \
|
||||
arch/qatomic_armv6.h \
|
||||
|
@ -1,6 +0,0 @@
|
||||
#
|
||||
# 'generic' architecture
|
||||
#
|
||||
|
||||
unix:SOURCES += qatomic_generic_unix.cpp
|
||||
win32:SOURCES += qatomic_generic_windows.cpp
|
@ -1,120 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qplatformdefs.h"
|
||||
|
||||
#include <QtCore/qatomic.h>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
static pthread_mutex_t qAtomicMutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
Q_CORE_EXPORT
|
||||
bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue)
|
||||
{
|
||||
bool returnValue = false;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
if (*_q_value == expectedValue) {
|
||||
*_q_value = newValue;
|
||||
returnValue = true;
|
||||
}
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue)
|
||||
{
|
||||
int returnValue;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
returnValue = *_q_value;
|
||||
*_q_value = newValue;
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd)
|
||||
{
|
||||
int returnValue;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
returnValue = *_q_value;
|
||||
*_q_value += valueToAdd;
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value,
|
||||
void *expectedValue,
|
||||
void *newValue)
|
||||
{
|
||||
bool returnValue = false;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
if (*_q_value == expectedValue) {
|
||||
*_q_value = newValue;
|
||||
returnValue = true;
|
||||
}
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue)
|
||||
{
|
||||
void *returnValue;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
returnValue = *_q_value;
|
||||
*_q_value = newValue;
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd)
|
||||
{
|
||||
void *returnValue;
|
||||
pthread_mutex_lock(&qAtomicMutex);
|
||||
returnValue = *_q_value;
|
||||
*_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
|
||||
pthread_mutex_unlock(&qAtomicMutex);
|
||||
return returnValue;
|
||||
}
|
||||
QT_END_NAMESPACE
|
@ -1,131 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "qplatformdefs.h"
|
||||
|
||||
#include <QtCore/qatomic.h>
|
||||
|
||||
|
||||
class QCriticalSection
|
||||
{
|
||||
public:
|
||||
QCriticalSection() { InitializeCriticalSection(§ion); }
|
||||
~QCriticalSection() { DeleteCriticalSection(§ion); }
|
||||
void lock() { EnterCriticalSection(§ion); }
|
||||
void unlock() { LeaveCriticalSection(§ion); }
|
||||
|
||||
private:
|
||||
CRITICAL_SECTION section;
|
||||
};
|
||||
|
||||
static QCriticalSection qAtomicCriticalSection;
|
||||
|
||||
Q_CORE_EXPORT
|
||||
bool QBasicAtomicInt_testAndSetOrdered(volatile int *_q_value, int expectedValue, int newValue)
|
||||
{
|
||||
bool returnValue = false;
|
||||
qAtomicCriticalSection.lock();
|
||||
if (*_q_value == expectedValue) {
|
||||
*_q_value = newValue;
|
||||
returnValue = true;
|
||||
}
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *_q_value, int newValue)
|
||||
{
|
||||
int returnValue;
|
||||
qAtomicCriticalSection.lock();
|
||||
returnValue = *_q_value;
|
||||
*_q_value = newValue;
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
int QBasicAtomicInt_fetchAndAddOrdered(volatile int *_q_value, int valueToAdd)
|
||||
{
|
||||
int returnValue;
|
||||
qAtomicCriticalSection.lock();
|
||||
returnValue = *_q_value;
|
||||
*_q_value += valueToAdd;
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *_q_value,
|
||||
void *expectedValue,
|
||||
void *newValue)
|
||||
{
|
||||
bool returnValue = false;
|
||||
qAtomicCriticalSection.lock();
|
||||
if (*_q_value == expectedValue) {
|
||||
*_q_value = newValue;
|
||||
returnValue = true;
|
||||
}
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *_q_value, void *newValue)
|
||||
{
|
||||
void *returnValue;
|
||||
qAtomicCriticalSection.lock();
|
||||
returnValue = *_q_value;
|
||||
*_q_value = newValue;
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
Q_CORE_EXPORT
|
||||
void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *_q_value, qptrdiff valueToAdd)
|
||||
{
|
||||
void *returnValue;
|
||||
qAtomicCriticalSection.lock();
|
||||
returnValue = *_q_value;
|
||||
*_q_value = reinterpret_cast<char *>(returnValue) + valueToAdd;
|
||||
qAtomicCriticalSection.unlock();
|
||||
return returnValue;
|
||||
}
|
@ -54,8 +54,6 @@ QT_BEGIN_HEADER
|
||||
# include "QtCore/qatomic_alpha.h"
|
||||
#elif defined(QT_ARCH_BFIN)
|
||||
# include "QtCore/qatomic_bfin.h"
|
||||
#elif defined(QT_ARCH_GENERIC)
|
||||
# include "QtCore/qatomic_generic.h"
|
||||
#elif defined(QT_ARCH_POWERPC)
|
||||
# include "QtCore/qatomic_powerpc.h"
|
||||
#elif defined(QT_ARCH_S390)
|
||||
|
@ -1,282 +0,0 @@
|
||||
/****************************************************************************
|
||||
**
|
||||
** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
|
||||
** Contact: http://www.qt-project.org/
|
||||
**
|
||||
** This file is part of the QtCore module of the Qt Toolkit.
|
||||
**
|
||||
** $QT_BEGIN_LICENSE:LGPL$
|
||||
** GNU Lesser General Public License Usage
|
||||
** This file may be used under the terms of the GNU Lesser General Public
|
||||
** License version 2.1 as published by the Free Software Foundation and
|
||||
** appearing in the file LICENSE.LGPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU Lesser
|
||||
** General Public License version 2.1 requirements will be met:
|
||||
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt LGPL Exception
|
||||
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License version 3.0 as published by the Free Software Foundation
|
||||
** and appearing in the file LICENSE.GPL included in the packaging of this
|
||||
** file. Please review the following information to ensure the GNU General
|
||||
** Public License version 3.0 requirements will be met:
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** Other Usage
|
||||
** Alternatively, this file may be used in accordance with the terms and
|
||||
** conditions contained in a signed written agreement between you and Nokia.
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
**
|
||||
** $QT_END_LICENSE$
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef QATOMIC_GENERIC_H
|
||||
#define QATOMIC_GENERIC_H
|
||||
|
||||
QT_BEGIN_HEADER
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
|
||||
#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE
|
||||
|
||||
inline bool QBasicAtomicInt::isReferenceCountingNative()
|
||||
{ return false; }
|
||||
inline bool QBasicAtomicInt::isReferenceCountingWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE
|
||||
|
||||
inline bool QBasicAtomicInt::isTestAndSetNative()
|
||||
{ return false; }
|
||||
inline bool QBasicAtomicInt::isTestAndSetWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE
|
||||
|
||||
inline bool QBasicAtomicInt::isFetchAndStoreNative()
|
||||
{ return false; }
|
||||
inline bool QBasicAtomicInt::isFetchAndStoreWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE
|
||||
|
||||
inline bool QBasicAtomicInt::isFetchAndAddNative()
|
||||
{ return false; }
|
||||
inline bool QBasicAtomicInt::isFetchAndAddWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative()
|
||||
{ return false; }
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative()
|
||||
{ return false; }
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree()
|
||||
{ return false; }
|
||||
|
||||
#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative()
|
||||
{ return false; }
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree()
|
||||
{ return false; }
|
||||
|
||||
Q_CORE_EXPORT bool QBasicAtomicInt_testAndSetOrdered(volatile int *, int, int);
|
||||
Q_CORE_EXPORT int QBasicAtomicInt_fetchAndStoreOrdered(volatile int *, int);
|
||||
Q_CORE_EXPORT int QBasicAtomicInt_fetchAndAddOrdered(volatile int *, int);
|
||||
|
||||
Q_CORE_EXPORT bool QBasicAtomicPointer_testAndSetOrdered(void * volatile *, void *, void *);
|
||||
Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndStoreOrdered(void * volatile *, void *);
|
||||
Q_CORE_EXPORT void *QBasicAtomicPointer_fetchAndAddOrdered(void * volatile *, qptrdiff);
|
||||
|
||||
// Reference counting
|
||||
|
||||
inline bool QBasicAtomicInt::ref()
|
||||
{
|
||||
return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, 1) != -1;
|
||||
}
|
||||
|
||||
inline bool QBasicAtomicInt::deref()
|
||||
{
|
||||
return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, -1) != 1;
|
||||
}
|
||||
|
||||
// Test and set for integers
|
||||
|
||||
inline bool QBasicAtomicInt::testAndSetOrdered(int expectedValue, int newValue)
|
||||
{
|
||||
return QBasicAtomicInt_testAndSetOrdered(&_q_value, expectedValue, newValue);
|
||||
}
|
||||
|
||||
inline bool QBasicAtomicInt::testAndSetRelaxed(int expectedValue, int newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
inline bool QBasicAtomicInt::testAndSetAcquire(int expectedValue, int newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
inline bool QBasicAtomicInt::testAndSetRelease(int expectedValue, int newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
// Fetch and store for integers
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndStoreOrdered(int newValue)
|
||||
{
|
||||
return QBasicAtomicInt_fetchAndStoreOrdered(&_q_value, newValue);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndStoreRelaxed(int newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndStoreAcquire(int newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndStoreRelease(int newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
// Fetch and add for integers
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndAddOrdered(int valueToAdd)
|
||||
{
|
||||
return QBasicAtomicInt_fetchAndAddOrdered(&_q_value, valueToAdd);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndAddRelaxed(int valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndAddAcquire(int valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
inline int QBasicAtomicInt::fetchAndAddRelease(int valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
// Test and set for pointers
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetOrdered(T *expectedValue, T *newValue)
|
||||
{
|
||||
union { T * volatile * typed; void * volatile * voidp; } pointer;
|
||||
pointer.typed = &_q_value;
|
||||
return QBasicAtomicPointer_testAndSetOrdered(pointer.voidp, expectedValue, newValue);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelaxed(T *expectedValue, T *newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetAcquire(T *expectedValue, T *newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::testAndSetRelease(T *expectedValue, T *newValue)
|
||||
{
|
||||
return testAndSetOrdered(expectedValue, newValue);
|
||||
}
|
||||
|
||||
// Fetch and store for pointers
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreOrdered(T *newValue)
|
||||
{
|
||||
union { T * volatile * typed; void * volatile * voidp; } pointer;
|
||||
union { T *typed; void *voidp; } returnValue;
|
||||
pointer.typed = &_q_value;
|
||||
returnValue.voidp = QBasicAtomicPointer_fetchAndStoreOrdered(pointer.voidp, newValue);
|
||||
return returnValue.typed;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelaxed(T *newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreAcquire(T *newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndStoreRelease(T *newValue)
|
||||
{
|
||||
return fetchAndStoreOrdered(newValue);
|
||||
}
|
||||
|
||||
// Fetch and add for pointers
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddOrdered(qptrdiff valueToAdd)
|
||||
{
|
||||
union { T * volatile *typed; void * volatile *voidp; } pointer;
|
||||
union { T *typed; void *voidp; } returnValue;
|
||||
pointer.typed = &_q_value;
|
||||
returnValue.voidp = QBasicAtomicPointer_fetchAndAddOrdered(pointer.voidp, valueToAdd * sizeof(T));
|
||||
return returnValue.typed;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelaxed(qptrdiff valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddAcquire(qptrdiff valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Q_INLINE_TEMPLATE T *QBasicAtomicPointer<T>::fetchAndAddRelease(qptrdiff valueToAdd)
|
||||
{
|
||||
return fetchAndAddOrdered(valueToAdd);
|
||||
}
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
||||
QT_END_HEADER
|
||||
|
||||
#endif // QATOMIC_GENERIC_H
|
Loading…
Reference in New Issue
Block a user