aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4typedarray.cpp
diff options
context:
space:
mode:
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>
};
}