summaryrefslogtreecommitdiffstats
path: root/src/corelib/kernel/qmetaobject.cpp
diff options
context:
space:
mode:
authorMike Achtelik <mike.achtelik@gmail.com>2020-06-15 10:08:14 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-06-25 06:35:25 +0000
commit20609e253ac07760a45cfea0662577933d4477f9 (patch)
tree633aaf555e6fc9db656e829d03162daf0fc8e981 /src/corelib/kernel/qmetaobject.cpp
parentb6d7b0ede59b52974baf53c805caecbb300ad90b (diff)
QMetaObject: Compare threadIds when checking receiver thread
Comparing threadIds is faster, especially if invoked from a non qt thread, where QThread::currentThread() needs to create a QAdoptedThread/QThreadData first. Change-Id: I44b3013283754f1a5ac9d62debcf4c82be77c554 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com> (cherry picked from commit 907027ab80c3caad91f935ee75606157bf938cac) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
Diffstat (limited to 'src/corelib/kernel/qmetaobject.cpp')
-rw-r--r--src/corelib/kernel/qmetaobject.cpp25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/corelib/kernel/qmetaobject.cpp b/src/corelib/kernel/qmetaobject.cpp
index 0da4a25016..47fcada302 100644
--- a/src/corelib/kernel/qmetaobject.cpp
+++ b/src/corelib/kernel/qmetaobject.cpp
@@ -56,6 +56,7 @@
#include "private/qobject_p.h"
#include "private/qmetaobject_p.h"
+#include "private/qthread_p.h"
// for normalizeTypeInternal
#include "private/qmetaobject_moc_p.h"
@@ -1526,10 +1527,14 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
if (! object)
return false;
- QThread *currentThread = QThread::currentThread();
+ Qt::HANDLE currentThreadId = QThread::currentThreadId();
QThread *objectThread = object->thread();
+ bool receiverInSameThread = false;
+ if (objectThread)
+ receiverInSameThread = currentThreadId == QThreadData::get2(objectThread)->threadId.loadRelaxed();
+
if (type == Qt::AutoConnection)
- type = (currentThread == objectThread) ? Qt::DirectConnection : Qt::QueuedConnection;
+ type = receiverInSameThread ? Qt::DirectConnection : Qt::QueuedConnection;
void *argv[] = { ret };
@@ -1545,7 +1550,7 @@ bool QMetaObject::invokeMethodImpl(QObject *object, QtPrivate::QSlotObjectBase *
QCoreApplication::postEvent(object, new QMetaCallEvent(slot, nullptr, -1, 1));
} else if (type == Qt::BlockingQueuedConnection) {
#if QT_CONFIG(thread)
- if (currentThread == objectThread)
+ if (receiverInSameThread)
qWarning("QMetaObject::invokeMethod: Dead lock detected");
QSemaphore semaphore;
@@ -2255,11 +2260,15 @@ bool QMetaMethod::invoke(QObject *object,
if (paramCount <= QMetaMethodPrivate::get(this)->parameterCount())
return false;
+ Qt::HANDLE currentThreadId = QThread::currentThreadId();
+ QThread *objectThread = object->thread();
+ bool receiverInSameThread = false;
+ if (objectThread)
+ receiverInSameThread = currentThreadId == QThreadData::get2(objectThread)->threadId.loadRelaxed();
+
// check connection type
if (connectionType == Qt::AutoConnection) {
- QThread *currentThread = QThread::currentThread();
- QThread *objectThread = object->thread();
- connectionType = currentThread == objectThread
+ connectionType = receiverInSameThread
? Qt::DirectConnection
: Qt::QueuedConnection;
}
@@ -2330,9 +2339,7 @@ bool QMetaMethod::invoke(QObject *object,
QCoreApplication::postEvent(object, event.take());
} else { // blocking queued connection
#if QT_CONFIG(thread)
- QThread *currentThread = QThread::currentThread();
- QThread *objectThread = object->thread();
- if (currentThread == objectThread) {
+ if (receiverInSameThread) {
qWarning("QMetaMethod::invoke: Dead lock detected in "
"BlockingQueuedConnection: Receiver is %s(%p)",
mobj->className(), object);