diff options
author | Mike Achtelik <mike.achtelik@gmail.com> | 2020-06-15 10:08:14 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2020-06-25 06:35:25 +0000 |
commit | 20609e253ac07760a45cfea0662577933d4477f9 (patch) | |
tree | 633aaf555e6fc9db656e829d03162daf0fc8e981 /src/corelib/kernel/qmetaobject.cpp | |
parent | b6d7b0ede59b52974baf53c805caecbb300ad90b (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.cpp | 25 |
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); |