aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlpropertycache_p.h
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@qt.io>2022-04-05 12:30:36 +0200
committerMarc Mutz <marc.mutz@qt.io>2022-04-05 22:57:56 +0200
commit9fd48a7b56f24f998d2becb869a4f704d2d9fb99 (patch)
treed0d5b76eb944207a6c173423ce60404f9cebc7a5 /src/qml/qml/qqmlpropertycache_p.h
parent7f349aeb3183c1945854a66180164c3f50a51895 (diff)
QQmlMetaObjectPointer: optimize atomic operations [1/2]: relaxed suffice
When asserting, or in isNull() or isShared(), we don't need an acquire fence, because the value of 'd' is all we're interested in. So just do one relaxed atomic load, as opposed to up to two load-acquire operations, which is what the old code used, via the implicit conversion operator. In the copy ctor, we can assume that external synchronization is in place otherwise reading from other would be a data race. Found by locally disabling QAtomic<T> -> T implicit conversion operators. Change-Id: I6158878a4fa9b0b511b346026f32585176b01beb Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/qml/qml/qqmlpropertycache_p.h')
-rw-r--r--src/qml/qml/qqmlpropertycache_p.h12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlpropertycache_p.h b/src/qml/qml/qqmlpropertycache_p.h
index 904bc0e5b4..7f3fc5f4fc 100644
--- a/src/qml/qml/qqmlpropertycache_p.h
+++ b/src/qml/qml/qqmlpropertycache_p.h
@@ -80,7 +80,7 @@ public:
QQmlMetaObjectPointer(const QMetaObject *staticMetaObject)
: d(quintptr(staticMetaObject))
{
- Q_ASSERT((d & Shared) == 0);
+ Q_ASSERT((d.loadRelaxed() & Shared) == 0);
}
~QQmlMetaObjectPointer()
@@ -93,8 +93,9 @@ public:
: d(other.d.loadRelaxed())
{
// other has to survive until this ctor is done. So d cannot disappear before.
- if (d & Shared)
- reinterpret_cast<SharedHolder *>(d ^ Shared)->addref();
+ const auto od = other.d.loadRelaxed();
+ if (od & Shared)
+ reinterpret_cast<SharedHolder *>(od ^ Shared)->addref();
}
QQmlMetaObjectPointer(QQmlMetaObjectPointer &&other) = delete;
@@ -119,12 +120,13 @@ public:
{
// This works because static metaobjects need to be set in the ctor and once a shared
// metaobject has been set, it cannot be removed anymore.
- return !d || (d & Shared);
+ const auto dd = d.loadRelaxed();
+ return !dd || (dd & Shared);
}
bool isNull() const
{
- return d == 0;
+ return d.loadRelaxed() == 0;
}
private: