aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@theqtcompany.com>2016-03-03 11:25:27 +0100
committerUlf Hermann <ulf.hermann@theqtcompany.com>2016-03-11 09:18:58 +0000
commit9ca9de7cbc8b045c19899987d6666576399af33d (patch)
tree43edf7e25ffb0fba2578db47bf5c0175fea76ced
parentd87572053a15474a577dcf5714187fbdb4cfec0d (diff)
QmlDebug: Support sending multiple messages per packet
This reduces the overhead caused by the prepending of service names to packets. When running the planets example from qtcanvas3d through qmlprofiler the average message length, without service name, is 26 bytes. The average full packet, with name and length, is 64 bytes long. In fact, the time between stopping the application and the last message arriving in the profiling client is reduced by 30-50% with this change. Change-Id: I0ffdd0483d45bbe8b092c59a9dcd63c6dc59119c Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
-rw-r--r--src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp31
-rw-r--r--src/qmldebug/qqmldebugconnection.cpp13
2 files changed, 32 insertions, 12 deletions
diff --git a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
index a5f9ed9a1a..7c18f0c38a 100644
--- a/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
+++ b/src/plugins/qmltooling/qmldbg_server/qqmldebugserver.cpp
@@ -186,6 +186,7 @@ private:
QStringList m_clientPlugins;
bool m_gotHello;
bool m_blockingMode;
+ bool m_clientSupportsMultiPackets;
QHash<QJSEngine *, EngineCondition> m_engineConditions;
@@ -274,7 +275,8 @@ static void cleanupOnShutdown()
QQmlDebugServerImpl::QQmlDebugServerImpl() :
m_connection(0),
m_gotHello(false),
- m_blockingMode(false)
+ m_blockingMode(false),
+ m_clientSupportsMultiPackets(false)
{
static bool postRoutineAdded = false;
if (!postRoutineAdded) {
@@ -456,6 +458,11 @@ void QQmlDebugServerImpl::receiveMessage()
s_dataStreamVersion = QDataStream::Qt_DefaultCompiledVersion;
}
+ if (!in.atEnd())
+ in >> m_clientSupportsMultiPackets;
+ else
+ m_clientSupportsMultiPackets = false;
+
// Send the hello answer immediately, since it needs to arrive before
// the plugins below start sending messages.
@@ -516,14 +523,16 @@ void QQmlDebugServerImpl::receiveMessage()
} else {
if (m_gotHello) {
- QByteArray message;
- in >> message;
-
QHash<QString, QQmlDebugService *>::Iterator iter = m_plugins.find(name);
if (iter == m_plugins.end()) {
qWarning() << "QML Debugger: Message received for missing plugin" << name << '.';
} else {
- (*iter)->messageReceived(message);
+ QQmlDebugService *service = *iter;
+ QByteArray message;
+ while (!in.atEnd()) {
+ in >> message;
+ service->messageReceived(message);
+ }
}
} else {
qWarning("QML Debugger: Invalid hello message.");
@@ -686,8 +695,16 @@ void QQmlDebugServerImpl::sendMessage(const QString &name, const QByteArray &mes
void QQmlDebugServerImpl::sendMessages(const QString &name, const QList<QByteArray> &messages)
{
if (canSendMessage(name)) {
- foreach (const QByteArray &message, messages)
- doSendMessage(name, message);
+ if (m_clientSupportsMultiPackets) {
+ QQmlDebugPacket out;
+ out << name;
+ foreach (const QByteArray &message, messages)
+ out << message;
+ m_protocol->send(out.data());
+ } else {
+ foreach (const QByteArray &message, messages)
+ doSendMessage(name, message);
+ }
m_connection->flush();
}
}
diff --git a/src/qmldebug/qqmldebugconnection.cpp b/src/qmldebug/qqmldebugconnection.cpp
index 37b66889cd..35a540bff8 100644
--- a/src/qmldebug/qqmldebugconnection.cpp
+++ b/src/qmldebug/qqmldebugconnection.cpp
@@ -106,7 +106,8 @@ void QQmlDebugConnection::socketConnected()
{
Q_D(QQmlDebugConnection);
QPacket pack(d->currentDataStreamVersion);
- pack << serverId << 0 << protocolVersion << d->plugins.keys() << d->maximumDataStreamVersion;
+ pack << serverId << 0 << protocolVersion << d->plugins.keys() << d->maximumDataStreamVersion
+ << true; // We accept multiple messages per packet
d->protocol->send(pack.data());
d->flush();
}
@@ -221,9 +222,6 @@ void QQmlDebugConnection::protocolReadyRead()
qWarning() << "QQmlDebugConnection: Unknown control message id" << op;
}
} else {
- QByteArray message;
- pack >> message;
-
QHash<QString, QQmlDebugClient *>::Iterator iter = d->plugins.find(name);
if (iter == d->plugins.end()) {
// We can get more messages for plugins we have removed because it takes time to
@@ -232,7 +230,12 @@ void QQmlDebugConnection::protocolReadyRead()
qWarning() << "QQmlDebugConnection: Message received for missing plugin"
<< name;
} else {
- (*iter)->messageReceived(message);
+ QQmlDebugClient *client = *iter;
+ QByteArray message;
+ while (!pack.atEnd()) {
+ pack >> message;
+ client->messageReceived(message);
+ }
}
}
}