summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorten Sorvig <morten.sorvig@nokia.com>2010-01-29 00:11:22 +0100
committerMorten Sorvig <morten.sorvig@nokia.com>2010-01-29 00:11:22 +0100
commit73e6984b7835b4fa7bc526499d6917fcddadb1d1 (patch)
treec175be9d73d469250a97c30d69456d1c9ddb53d5
parent373eb7c58ffd5fe1c57bdf2a1c91683cfcc131f9 (diff)
Implement atomics using the NaCl builtins.
-rw-r--r--src/corelib/arch/nacl/qatomic_nacl.cpp66
-rw-r--r--src/corelib/arch/qatomic_nacl.h32
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