diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-08-24 17:17:34 +0200 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-08-26 16:59:37 +0000 |
commit | 83ded6108a947453744114543146a7f691f6f1aa (patch) | |
tree | 499b8b296a6978f799f78ac58d4ab0f7b0ddd8a0 /src/qml/jsruntime/qv4typedarray.cpp | |
parent | e4e220fb568e22a4da7e6bd3d28ac34038041759 (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.cpp | 51 |
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> }; } |