From 3c211558f6b571555558bd1fc59774e36a6da710 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Tue, 20 Dec 2011 16:54:50 +0100 Subject: [PATCH] Debugger: Allow transmissions of network packets in one go We did call a flush() after every single packet, which was slowing down things especially for the QDeclarativeDebugTrace service. Change-Id: Idab074941a22364e154502eb12afa43b4dd33c22 Reviewed-by: Aurindam Jana Reviewed-by: Christiaan Janssen --- .../debugger/qdeclarativedebugserver.cpp | 26 +++++++++++++--------- .../debugger/qdeclarativedebugserver_p.h | 4 ++-- .../debugger/qdeclarativedebugserverconnection_p.h | 2 +- .../debugger/qdeclarativedebugservice.cpp | 7 +++++- .../debugger/qdeclarativedebugservice_p.h | 1 + .../debugger/qdeclarativedebugtrace.cpp | 5 +++-- src/declarative/debugger/qv8profilerservice.cpp | 4 +++- .../qmltooling/qmldbg_tcp/qtcpserverconnection.cpp | 11 ++++----- .../qmltooling/qmldbg_tcp/qtcpserverconnection.h | 2 +- 9 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/declarative/debugger/qdeclarativedebugserver.cpp b/src/declarative/debugger/qdeclarativedebugserver.cpp index df5c5f1..2914f6d 100644 --- a/src/declarative/debugger/qdeclarativedebugserver.cpp +++ b/src/declarative/debugger/qdeclarativedebugserver.cpp @@ -106,7 +106,7 @@ public: private: // private slot - void _q_sendMessage(const QByteArray &message); + void _q_sendMessages(const QList &messages); }; class QDeclarativeDebugServerThread : public QThread @@ -134,6 +134,8 @@ QDeclarativeDebugServerPrivate::QDeclarativeDebugServerPrivate() : gotHello(false), thread(0) { + // used in _q_sendMessages + qRegisterMetaType >("QList"); } void QDeclarativeDebugServerPrivate::advertisePlugins() @@ -155,7 +157,7 @@ void QDeclarativeDebugServerPrivate::advertisePlugins() out << QString(QLatin1String("QDeclarativeDebugClient")) << 1 << pluginNames << pluginVersions; } - QMetaObject::invokeMethod(q, "_q_sendMessage", Qt::QueuedConnection, Q_ARG(QByteArray, message)); + QMetaObject::invokeMethod(q, "_q_sendMessages", Qt::QueuedConnection, Q_ARG(QList, QList() << message)); } QDeclarativeDebugServerConnection *QDeclarativeDebugServerPrivate::loadConnectionPlugin( @@ -368,7 +370,7 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message) out << QString(QLatin1String("QDeclarativeDebugClient")) << 0 << protocolVersion << pluginNames << pluginVersions; } - d->connection->send(helloAnswer); + d->connection->send(QList() << helloAnswer); d->gotHello = true; @@ -434,10 +436,10 @@ void QDeclarativeDebugServer::receiveMessage(const QByteArray &message) } } -void QDeclarativeDebugServerPrivate::_q_sendMessage(const QByteArray &message) +void QDeclarativeDebugServerPrivate::_q_sendMessages(const QList &messages) { if (connection) - connection->send(message); + connection->send(messages); } QList QDeclarativeDebugServer::services() const @@ -495,16 +497,18 @@ bool QDeclarativeDebugServer::removeService(QDeclarativeDebugService *service) return true; } -void QDeclarativeDebugServer::sendMessage(QDeclarativeDebugService *service, - const QByteArray &message) +void QDeclarativeDebugServer::sendMessages(QDeclarativeDebugService *service, + const QList &messages) { - QByteArray msg; - { - QDataStream out(&msg, QIODevice::WriteOnly); + QList prefixedMessages; + foreach (const QByteArray &message, messages) { + QByteArray prefixed; + QDataStream out(&prefixed, QIODevice::WriteOnly); out << service->name() << message; + prefixedMessages << prefixed; } - QMetaObject::invokeMethod(this, "_q_sendMessage", Qt::QueuedConnection, Q_ARG(QByteArray, msg)); + QMetaObject::invokeMethod(this, "_q_sendMessages", Qt::QueuedConnection, Q_ARG(QList, prefixedMessages)); } bool QDeclarativeDebugServer::waitForMessage(QDeclarativeDebugService *service) diff --git a/src/declarative/debugger/qdeclarativedebugserver_p.h b/src/declarative/debugger/qdeclarativedebugserver_p.h index 23a38b3..806a1f1 100644 --- a/src/declarative/debugger/qdeclarativedebugserver_p.h +++ b/src/declarative/debugger/qdeclarativedebugserver_p.h @@ -89,14 +89,14 @@ public: void receiveMessage(const QByteArray &message); bool waitForMessage(QDeclarativeDebugService *service); - void sendMessage(QDeclarativeDebugService *service, const QByteArray &message); + void sendMessages(QDeclarativeDebugService *service, const QList &messages); private: friend class QDeclarativeDebugService; friend class QDeclarativeDebugServicePrivate; friend class QDeclarativeDebugServerThread; QDeclarativeDebugServer(); - Q_PRIVATE_SLOT(d_func(), void _q_sendMessage(QByteArray)) + Q_PRIVATE_SLOT(d_func(), void _q_sendMessages(QList)) }; QT_END_NAMESPACE diff --git a/src/declarative/debugger/qdeclarativedebugserverconnection_p.h b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h index a3e439d..f001780 100644 --- a/src/declarative/debugger/qdeclarativedebugserverconnection_p.h +++ b/src/declarative/debugger/qdeclarativedebugserverconnection_p.h @@ -71,7 +71,7 @@ public: virtual void setServer(QDeclarativeDebugServer *server) = 0; virtual void setPort(int port, bool bock) = 0; virtual bool isConnected() const = 0; - virtual void send(const QByteArray &message) = 0; + virtual void send(const QList &messages) = 0; virtual void disconnect() = 0; virtual bool waitForMessage() = 0; }; diff --git a/src/declarative/debugger/qdeclarativedebugservice.cpp b/src/declarative/debugger/qdeclarativedebugservice.cpp index 5606540..23ee4a3 100644 --- a/src/declarative/debugger/qdeclarativedebugservice.cpp +++ b/src/declarative/debugger/qdeclarativedebugservice.cpp @@ -230,12 +230,17 @@ QString QDeclarativeDebugService::objectToString(QObject *obj) void QDeclarativeDebugService::sendMessage(const QByteArray &message) { + sendMessages(QList() << message); +} + +void QDeclarativeDebugService::sendMessages(const QList &messages) +{ Q_D(QDeclarativeDebugService); if (status() != Enabled) return; - d->server->sendMessage(this, message); + d->server->sendMessages(this, messages); } bool QDeclarativeDebugService::waitForMessage() diff --git a/src/declarative/debugger/qdeclarativedebugservice_p.h b/src/declarative/debugger/qdeclarativedebugservice_p.h index 9698f91..b9831cb 100644 --- a/src/declarative/debugger/qdeclarativedebugservice_p.h +++ b/src/declarative/debugger/qdeclarativedebugservice_p.h @@ -81,6 +81,7 @@ public: Status status() const; void sendMessage(const QByteArray &); + void sendMessages(const QList &); bool waitForMessage(); static int idForObject(QObject *); diff --git a/src/declarative/debugger/qdeclarativedebugtrace.cpp b/src/declarative/debugger/qdeclarativedebugtrace.cpp index 724399d..6bce7d7 100644 --- a/src/declarative/debugger/qdeclarativedebugtrace.cpp +++ b/src/declarative/debugger/qdeclarativedebugtrace.cpp @@ -280,9 +280,10 @@ void QDeclarativeDebugTrace::setProfilingEnabled(bool enable) void QDeclarativeDebugTrace::sendMessages() { QMutexLocker locker(&m_mutex); - //### this is a suboptimal way to send batched messages + QList messages; for (int i = 0; i < m_data.count(); ++i) - sendMessage(m_data.at(i).toByteArray()); + messages << m_data.at(i).toByteArray(); + QDeclarativeDebugService::sendMessages(messages); m_data.clear(); //indicate completion diff --git a/src/declarative/debugger/qv8profilerservice.cpp b/src/declarative/debugger/qv8profilerservice.cpp index f5c980e..2c8ed36 100644 --- a/src/declarative/debugger/qv8profilerservice.cpp +++ b/src/declarative/debugger/qv8profilerservice.cpp @@ -241,8 +241,10 @@ void QV8ProfilerServicePrivate::sendMessages() { Q_Q(QV8ProfilerService); + QList messages; for (int i = 0; i < m_data.count(); ++i) - q->sendMessage(m_data.at(i).toByteArray()); + messages << m_data.at(i).toByteArray(); + q->sendMessages(messages); m_data.clear(); //indicate completion diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp index f9bf9dd..caaefbf 100644 --- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp @@ -96,7 +96,7 @@ bool QTcpServerConnection::isConnected() const return d->socket && d->socket->state() == QTcpSocket::ConnectedState; } -void QTcpServerConnection::send(const QByteArray &message) +void QTcpServerConnection::send(const QList &messages) { Q_D(QTcpServerConnection); @@ -104,10 +104,11 @@ void QTcpServerConnection::send(const QByteArray &message) || !d->protocol || !d->socket) return; - QPacket pack; - pack.writeRawData(message.data(), message.length()); - - d->protocol->send(pack); + foreach (const QByteArray &message, messages) { + QPacket pack; + pack.writeRawData(message.data(), message.length()); + d->protocol->send(pack); + } d->socket->flush(); } diff --git a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h index 315f55a..e6cba92 100644 --- a/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h +++ b/src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h @@ -65,7 +65,7 @@ public: void setPort(int port, bool bock); bool isConnected() const; - void send(const QByteArray &message); + void send(const QList &messages); void disconnect(); bool waitForMessage(); -- 2.7.4