aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4typedarray.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-24 17:17:34 +0200
committerLars Knoll <lars.knoll@qt.io>2018-08-26 16:59:37 +0000
commit83ded6108a947453744114543146a7f691f6f1aa (patch)
tree499b8b296a6978f799f78ac58d4ab0f7b0ddd8a0 /src/qml/jsruntime/qv4typedarray.cpp
parente4e220fb568e22a4da7e6bd3d28ac34038041759 (diff)
Implement most remaining methods of Atomics
The only missing ones now are wait() and wake(). Change-Id: I2c0ee78cdd8a249e0e841861dd4b76c4665b0ae0 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4typedarray.cpp')
-rw-r--r--src/qml/jsruntime/qv4typedarray.cpp51
1 files changed, 43 insertions, 8 deletions
diff --git a/src/qml/jsruntime/qv4typedarray.cpp b/src/qml/jsruntime/qv4typedarray.cpp
index 270462affa..7606af80cb 100644
--- a/src/qml/jsruntime/qv4typedarray.cpp
+++ b/src/qml/jsruntime/qv4typedarray.cpp
@@ -149,7 +149,7 @@ template <typename T>
ReturnedValue atomicAdd(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndAddOrdered(*mem, value);
return typeToValue(value);
}
@@ -158,7 +158,7 @@ template <typename T>
ReturnedValue atomicAnd(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndAndOrdered(*mem, value);
return typeToValue(value);
}
@@ -167,7 +167,7 @@ template <typename T>
ReturnedValue atomicExchange(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndStoreOrdered(*mem, value);
return typeToValue(value);
}
@@ -176,7 +176,7 @@ template <typename T>
ReturnedValue atomicOr(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndOrOrdered(*mem, value);
return typeToValue(value);
}
@@ -185,7 +185,7 @@ template <typename T>
ReturnedValue atomicSub(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndSubOrdered(*mem, value);
return typeToValue(value);
}
@@ -194,11 +194,40 @@ template <typename T>
ReturnedValue atomicXor(char *data, Value v)
{
T value = valueToType<T>(v);
- typename QAtomicOps< T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
value = QAtomicOps<T>::fetchAndXorOrdered(*mem, value);
return typeToValue(value);
}
+template <typename T>
+ReturnedValue atomicCompareExchange(char *data, Value expected, Value v)
+{
+ T value = valueToType<T>(v);
+ T exp = valueToType<T>(expected);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ T old;
+ QAtomicOps<T>::testAndSetOrdered(*mem, exp, value, &old);
+ return typeToValue(old);
+}
+
+template <typename T>
+ReturnedValue atomicLoad(char *data)
+{
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ T val = QAtomicOps<T>::load(*mem);
+ return typeToValue(val);
+}
+
+template <typename T>
+ReturnedValue atomicStore(char *data, Value v)
+{
+ T value = valueToType<T>(v);
+ typename QAtomicOps<T>::Type *mem = reinterpret_cast<typename QAtomicOps<T>::Type *>(data);
+ QAtomicOps<T>::store(*mem, value);
+ return typeToValue(value);
+}
+
+
template<typename T>
constexpr TypedArrayOperations TypedArrayOperations::create(const char *name)
{
@@ -206,7 +235,10 @@ constexpr TypedArrayOperations TypedArrayOperations::create(const char *name)
name,
::read<T>,
::write<T>,
- { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }
+ { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr },
+ nullptr,
+ nullptr,
+ nullptr
};
}
@@ -217,7 +249,10 @@ constexpr TypedArrayOperations TypedArrayOperations::createWithAtomics(const cha
name,
::read<T>,
::write<T>,
- { ::atomicAdd<T>, ::atomicAnd<T>, ::atomicExchange<T>, ::atomicOr<T>, ::atomicSub<T>, ::atomicXor<T> }
+ { ::atomicAdd<T>, ::atomicAnd<T>, ::atomicExchange<T>, ::atomicOr<T>, ::atomicSub<T>, ::atomicXor<T> },
+ ::atomicCompareExchange<T>,
+ ::atomicLoad<T>,
+ ::atomicStore<T>
};
}