Debugger: Allow transmissions of network packets in one go
authorKai Koehne <kai.koehne@nokia.com>
Tue, 20 Dec 2011 15:54:50 +0000 (16:54 +0100)
committerQt by Nokia <qt-info@nokia.com>
Wed, 21 Dec 2011 13:42:29 +0000 (14:42 +0100)
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 <aurindam.jana@nokia.com>
Reviewed-by: Christiaan Janssen <christiaan.janssen@nokia.com>
src/declarative/debugger/qdeclarativedebugserver.cpp
src/declarative/debugger/qdeclarativedebugserver_p.h
src/declarative/debugger/qdeclarativedebugserverconnection_p.h
src/declarative/debugger/qdeclarativedebugservice.cpp
src/declarative/debugger/qdeclarativedebugservice_p.h
src/declarative/debugger/qdeclarativedebugtrace.cpp
src/declarative/debugger/qv8profilerservice.cpp
src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.cpp
src/plugins/qmltooling/qmldbg_tcp/qtcpserverconnection.h

index df5c5f1..2914f6d 100644 (file)
@@ -106,7 +106,7 @@ public:
 
 private:
     // private slot
-    void _q_sendMessage(const QByteArray &message);
+    void _q_sendMessages(const QList<QByteArray> &messages);
 };
 
 class QDeclarativeDebugServerThread : public QThread
@@ -134,6 +134,8 @@ QDeclarativeDebugServerPrivate::QDeclarativeDebugServerPrivate() :
     gotHello(false),
     thread(0)
 {
+    // used in _q_sendMessages
+    qRegisterMetaType<QList<QByteArray> >("QList<QByteArray>");
 }
 
 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<QByteArray>, QList<QByteArray>() << 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<QByteArray>() << 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<QByteArray> &messages)
 {
     if (connection)
-        connection->send(message);
+        connection->send(messages);
 }
 
 QList<QDeclarativeDebugService*> 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<QByteArray> &messages)
 {
-    QByteArray msg;
-    {
-        QDataStream out(&msg, QIODevice::WriteOnly);
+    QList<QByteArray> 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<QByteArray>, prefixedMessages));
 }
 
 bool QDeclarativeDebugServer::waitForMessage(QDeclarativeDebugService *service)
index 23a38b3..806a1f1 100644 (file)
@@ -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<QByteArray> &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<QByteArray>))
 };
 
 QT_END_NAMESPACE
index a3e439d..f001780 100644 (file)
@@ -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<QByteArray> &messages) = 0;
     virtual void disconnect() = 0;
     virtual bool waitForMessage() = 0;
 };
index 5606540..23ee4a3 100644 (file)
@@ -230,12 +230,17 @@ QString QDeclarativeDebugService::objectToString(QObject *obj)
 
 void QDeclarativeDebugService::sendMessage(const QByteArray &message)
 {
+    sendMessages(QList<QByteArray>() << message);
+}
+
+void QDeclarativeDebugService::sendMessages(const QList<QByteArray> &messages)
+{
     Q_D(QDeclarativeDebugService);
 
     if (status() != Enabled)
         return;
 
-    d->server->sendMessage(this, message);
+    d->server->sendMessages(this, messages);
 }
 
 bool QDeclarativeDebugService::waitForMessage()
index 9698f91..b9831cb 100644 (file)
@@ -81,6 +81,7 @@ public:
     Status status() const;
 
     void sendMessage(const QByteArray &);
+    void sendMessages(const QList<QByteArray> &);
     bool waitForMessage();
 
     static int idForObject(QObject *);
index 724399d..6bce7d7 100644 (file)
@@ -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<QByteArray> 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
index f5c980e..2c8ed36 100644 (file)
@@ -241,8 +241,10 @@ void QV8ProfilerServicePrivate::sendMessages()
 {
     Q_Q(QV8ProfilerService);
 
+    QList<QByteArray> 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
index f9bf9dd..caaefbf 100644 (file)
@@ -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<QByteArray> &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();
 }
 
index 315f55a..e6cba92 100644 (file)
@@ -65,7 +65,7 @@ public:
     void setPort(int port, bool bock);
 
     bool isConnected() const;
-    void send(const QByteArray &message);
+    void send(const QList<QByteArray> &messages);
     void disconnect();
     bool waitForMessage();