Optimize reads from QObjectPrivate::threadData

The implicit conversion operator from QAtomicPointer<T> → 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 <sona.kurazyan@qt.io>
This commit is contained in:
Marc Mutz 2022-05-17 17:01:52 +02:00
parent 37f277f3d7
commit e02a171a47
2 changed files with 5 additions and 5 deletions

View File

@ -1140,7 +1140,7 @@ bool QCoreApplicationPrivate::sendThroughApplicationEventFilters(QObject *receiv
QObject *obj = extraData->eventFilters.at(i); QObject *obj = extraData->eventFilters.at(i);
if (!obj) if (!obj)
continue; 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."); qWarning("QCoreApplication: Application event filter cannot be in a different thread.");
continue; continue;
} }
@ -1158,7 +1158,7 @@ bool QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject *receiver, Q
QObject *obj = receiver->d_func()->extraData->eventFilters.at(i); QObject *obj = receiver->d_func()->extraData->eventFilters.at(i);
if (!obj) if (!obj)
continue; 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."); qWarning("QCoreApplication: Object event filter cannot be in a different thread.");
continue; continue;
} }
@ -1678,7 +1678,7 @@ void QCoreApplicationPrivate::sendPostedEvents(QObject *receiver, int event_type
event_type = 0; event_type = 0;
} }
if (receiver && receiver->d_func()->threadData != data) { if (receiver && receiver->d_func()->threadData.loadRelaxed() != data) {
qWarning("QCoreApplication::sendPostedEvents: Cannot send " qWarning("QCoreApplication::sendPostedEvents: Cannot send "
"posted events for objects in another thread"); "posted events for objects in another thread");
return; return;

View File

@ -2413,7 +2413,7 @@ void QObjectPrivate::setParent_helper(QObject *o)
parent = o; parent = o;
if (parent) { if (parent) {
// object hierarchies are constrained to a single thread // 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"); qWarning("QObject::setParent: Cannot set parent, new parent is in a different thread");
parent = nullptr; parent = nullptr;
return; return;
@ -2475,7 +2475,7 @@ void QObject::installEventFilter(QObject *obj)
Q_D(QObject); Q_D(QObject);
if (!obj) if (!obj)
return; 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."); qWarning("QObject::installEventFilter(): Cannot filter events for objects in a different thread.");
return; return;
} }