summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2013-12-19 19:05:27 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-27 15:51:16 +0100
commita001534f832e58cc081512e12a4b7266489f2ad7 (patch)
tree6ecd99250088336a75028695957f267a512efb63 /src
parent110890e091cd1f112b18196048f62efe7b858e19 (diff)
downloadqtwebchannel-a001534f832e58cc081512e12a4b7266489f2ad7.tar.gz
Optimize SignalHandler by obsoleting the call to senderSignalIndex.
This method is quite slow, and can be compared to two calls of sender(). We now encode the signal index in the methodId and thus do not have to call it anymore. The performance gain is about 27% (9.2 vs. 12.7ms). Change-Id: Iaa75efa27a54a21e27e62994de25cafd8136159d Reviewed-by: Zeno Albisser <zeno.albisser@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/webchannel/signalhandler_p.h33
1 files changed, 16 insertions, 17 deletions
diff --git a/src/webchannel/signalhandler_p.h b/src/webchannel/signalhandler_p.h
index 7360028..28b3f49 100644
--- a/src/webchannel/signalhandler_p.h
+++ b/src/webchannel/signalhandler_p.h
@@ -158,8 +158,8 @@ void SignalHandler<Receiver>::connectTo(const QObject *object, const int signalI
return;
} // otherwise not yet connected, do so now
- const int memberOffset = QObject::staticMetaObject.methodCount();
- QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset, Qt::DirectConnection, 0);
+ static const int memberOffset = QObject::staticMetaObject.methodCount();
+ QMetaObject::Connection connection = QMetaObject::connect(object, signal.methodIndex(), this, memberOffset + signalIndex, Qt::DirectConnection, 0);
if (!connection) {
qWarning() << "SignalHandler: QMetaObject::connect returned false. Unable to connect to" << object << signal.name() << signal.methodSignature();
return;
@@ -244,25 +244,24 @@ int SignalHandler<Receiver>::qt_metacall(QMetaObject::Call call, int methodId, v
return methodId;
if (call == QMetaObject::InvokeMetaMethod) {
- if (methodId == 0) {
- const QObject *object = sender();
- Q_ASSERT(object);
- const int signalIndex = senderSignalIndex();
- Q_ASSERT(signalIndex != -1);
+ const QObject *object = sender();
+ Q_ASSERT(object);
+ Q_ASSERT(senderSignalIndex() == methodId);
+ Q_ASSERT(m_connectionsCounter.contains(object));
+ Q_ASSERT(m_connectionsCounter.value(object).contains(methodId));
- dispatch(object, signalIndex, args);
+ dispatch(object, methodId, args);
- if (signalIndex == s_destroyedSignalIndex) {
- // disconnect on QObject::destroyed
- ConnectionHash::iterator it = m_connectionsCounter.find(object);
- Q_ASSERT(it != m_connectionsCounter.end());
- foreach (const ConnectionPair &connection, *it) {
- QObject::disconnect(connection.first);
- }
- m_connectionsCounter.erase(it);
+ if (methodId == s_destroyedSignalIndex) {
+ // disconnect on QObject::destroyed
+ ConnectionHash::iterator it = m_connectionsCounter.find(object);
+ Q_ASSERT(it != m_connectionsCounter.end());
+ foreach (const ConnectionPair &connection, *it) {
+ QObject::disconnect(connection.first);
}
+ m_connectionsCounter.erase(it);
}
- --methodId;
+ return -1;
}
return methodId;
}