From e02a171a47e87048d16faf7167c0fecd46a176b5 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Tue, 17 May 2022 17:01:52 +0200 Subject: [PATCH] Optimize reads from QObjectPrivate::threadData MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The implicit conversion operator from QAtomicPointer → T* performs a loadAcquire(). In the cases of this patch, we're only comparing pointer values to check whether QObject thread affinities are compatible, so relaxed loads suffice. Pick-to: 6.3 Change-Id: If19124778b4770d86baeaeb3c91214e47881b288 Reviewed-by: Sona Kurazyan --- src/corelib/kernel/qcoreapplication.cpp | 6 +++--- src/corelib/kernel/qobject.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp index 9937e018f6..13c792af29 100644 --- a/src/corelib/kernel/qcoreapplication.cpp +++ b/src/corelib/kernel/qcoreapplication.cpp @@ -1140,7 +1140,7 @@ bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiv QObject *obj = extraData->eventFilters.at(i); if (!obj) continue; - if (obj->d_func()->threadData != threadData) { + if (obj->d_func()->threadData.loadRelaxed() != threadData.loadRelaxed()) { qWarning("QCoreApplication: Application event filter cannot be in a different thread."); continue; } @@ -1158,7 +1158,7 @@ bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, Q QObject *obj = receiver->d_func()->extraData->eventFilters.at(i); if (!obj) continue; - if (obj->d_func()->threadData != receiver->d_func()->threadData) { + if (obj->d_func()->threadData.loadRelaxed() != receiver->d_func()->threadData.loadRelaxed()) { qWarning("QCoreApplication: Object event filter cannot be in a different thread."); continue; } @@ -1678,7 +1678,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type event_type = 0; } - if (receiver && receiver->d_func()->threadData != data) { + if (receiver && receiver->d_func()->threadData.loadRelaxed() != data) { qWarning("QCoreApplication::sendPostedEvents: Cannot send " "posted events for objects in another thread"); return; diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 3254f2a9fe..e438c11513 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -2413,7 +2413,7 @@ void QObjectPrivate::setParent_helper(QObject *o) parent = o; if (parent) { // object hierarchies are constrained to a single thread - if (threadData != parent->d_func()->threadData) { + if (threadData.loadRelaxed() != parent->d_func()->threadData.loadRelaxed()) { qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread"); parent = nullptr; return; @@ -2475,7 +2475,7 @@ void QObject::installEventFilter(QObject *obj) Q_D(QObject); if (!obj) return; - if (d->threadData != obj->d_func()->threadData) { + if (d->threadData.loadRelaxed() != obj->d_func()->threadData.loadRelaxed()) { qWarning("QObject::installEventFilter(): Cannot filter events for objects in a different thread."); return; }