diff options
author | Morten Sorvig <morten.sorvig@nokia.com> | 2010-01-29 00:11:22 +0100 |
---|---|---|
committer | Morten Sorvig <morten.sorvig@nokia.com> | 2010-01-29 00:11:22 +0100 |
commit | 73e6984b7835b4fa7bc526499d6917fcddadb1d1 (patch) | |
tree | c175be9d73d469250a97c30d69456d1c9ddb53d5 | |
parent | 373eb7c58ffd5fe1c57bdf2a1c91683cfcc131f9 (diff) |
Implement atomics using the NaCl builtins.
-rw-r--r-- | src/corelib/arch/nacl/qatomic_nacl.cpp | 66 | ||||
-rw-r--r-- | src/corelib/arch/qatomic_nacl.h | 32 |
2 files changed, 37 insertions, 61 deletions
diff --git a/src/corelib/arch/nacl/qatomic_nacl.cpp b/src/corelib/arch/nacl/qatomic_nacl.cpp index 293daaddc9..296fc66377 100644 --- a/src/corelib/arch/nacl/qatomic_nacl.cpp +++ b/src/corelib/arch/nacl/qatomic_nacl.cpp @@ -39,48 +39,31 @@ ** ****************************************************************************/ -#if !defined(Q_OS_SYMBIAN) || (defined(Q_OS_SYMBIAN) && !defined(Q_CC_RVCT)) - #include "qplatformdefs.h" #include <QtCore/qatomic.h> +#include <atomic_ops.h> +#include <stdio.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; -} + return (CompareAndSwap(_q_value, expectedValue, newValue) == newValue); + } 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; + return AtomicExchange(_q_value, newValue); } 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; + return AtomicIncrement(_q_value, valueToAdd); } Q_CORE_EXPORT @@ -88,36 +71,29 @@ 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; + return (CompareAndSwap(reinterpret_cast<volatile AtomicWord*>(_q_value), + reinterpret_cast<AtomicWord>(expectedValue), + reinterpret_cast<AtomicWord>(newValue)) + == reinterpret_cast<AtomicWord>(newValue)); } 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; + return reinterpret_cast<void *>( + AtomicExchange(reinterpret_cast<volatile AtomicWord*>(_q_value), + reinterpret_cast<AtomicWord>(newValue)) + ); } 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; + return reinterpret_cast<void *>( + AtomicIncrement(reinterpret_cast<volatile AtomicWord*>(_q_value), + *reinterpret_cast<AtomicWord *>(&valueToAdd)) + ); } + QT_END_NAMESPACE -#endif //!defined(Q_OS_SYMBIAN) && !defined(Q_CC_RVCT) + diff --git a/src/corelib/arch/qatomic_nacl.h b/src/corelib/arch/qatomic_nacl.h index 1e5fee88d3..3821d84cc0 100644 --- a/src/corelib/arch/qatomic_nacl.h +++ b/src/corelib/arch/qatomic_nacl.h @@ -45,58 +45,58 @@ QT_BEGIN_HEADER QT_BEGIN_NAMESPACE - -#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_NOT_NATIVE +dfdsf +#define Q_ATOMIC_INT_REFERENCE_COUNTING_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isReferenceCountingNative() -{ return false; } +{ return true; } inline bool QBasicAtomicInt::isReferenceCountingWaitFree() { return false; } -#define Q_ATOMIC_INT_TEST_AND_SET_IS_NOT_NATIVE +#define Q_ATOMIC_INT_TEST_AND_SET_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isTestAndSetNative() -{ return false; } +{ return true; } inline bool QBasicAtomicInt::isTestAndSetWaitFree() { return false; } -#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_NOT_NATIVE +#define Q_ATOMIC_INT_FETCH_AND_STORE_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isFetchAndStoreNative() -{ return false; } +{ return true; } inline bool QBasicAtomicInt::isFetchAndStoreWaitFree() { return false; } -#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_NOT_NATIVE +#define Q_ATOMIC_INT_FETCH_AND_ADD_IS_ALWAYS_NATIVE inline bool QBasicAtomicInt::isFetchAndAddNative() -{ return false; } +{ return true; } inline bool QBasicAtomicInt::isFetchAndAddWaitFree() { return false; } -#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_NOT_NATIVE +#define Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetNative() -{ return false; } +{ return true; } template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isTestAndSetWaitFree() { return false; } -#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_NOT_NATIVE +#define Q_ATOMIC_POINTER_FETCH_AND_STORE_IS_ALWAYS_NATIVE template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreNative() -{ return false; } +{ return true; } template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndStoreWaitFree() { return false; } -#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_NOT_NATIVE +#define Q_ATOMIC_POINTER_FETCH_AND_ADD_IS_ALWAYS_NATIVE template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddNative() -{ return false; } +{ return true; } template <typename T> Q_INLINE_TEMPLATE bool QBasicAtomicPointer<T>::isFetchAndAddWaitFree() { return false; } @@ -279,4 +279,4 @@ QT_END_NAMESPACE QT_END_HEADER -#endif // QATOMIC_GENERIC_H +#endif // QATOMIC_GENERIC_H |