diff options
author | Marc Mutz <marc.mutz@qt.io> | 2022-04-05 12:30:36 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@qt.io> | 2022-04-05 22:57:56 +0200 |
commit | 9fd48a7b56f24f998d2becb869a4f704d2d9fb99 (patch) | |
tree | d0d5b76eb944207a6c173423ce60404f9cebc7a5 /src/qml/qml/qqmlpropertycache_p.h | |
parent | 7f349aeb3183c1945854a66180164c3f50a51895 (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.h | 12 |
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: |