QmlProfiler: Process remaining events if connection drops

When the connection drops while receiving a trace we can easily process
the buffered events. The trace client test case has some traces with
trailing open ranges that can be recovered this way.

Change-Id: I8b2ecc135b0cabff18923fbc8f3f14b5cb3a96ee
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Ulf Hermann
2018-01-04 11:10:58 +01:00
parent 098fc76b63
commit 5bd0ee0b4c
3 changed files with 19 additions and 10 deletions

View File

@@ -58,6 +58,7 @@ public:
int resolveStackTop();
void forwardEvents(const QmlEvent &last);
void processCurrentEvent();
void finalize();
QmlProfilerTraceClient *q;
QmlProfilerModelManager *modelManager;
@@ -182,6 +183,19 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
}
}
void QmlProfilerTraceClientPrivate::finalize()
{
while (!rangesInProgress.isEmpty()) {
currentEvent = rangesInProgress.top();
currentEvent.event.setRangeStage(RangeEnd);
currentEvent.event.setTimestamp(maximumTime);
processCurrentEvent();
}
QTC_CHECK(pendingMessages.isEmpty());
while (!pendingDebugMessages.isEmpty())
modelManager->addEvent(pendingDebugMessages.dequeue());
}
void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
{
QmlDebug::QPacket stream(q->dataStreamVersion());
@@ -299,6 +313,8 @@ void QmlProfilerTraceClient::stateChanged(State status)
{
if (status == Enabled)
sendRecordingStatus(-1);
else
d->finalize();
}
void QmlProfilerTraceClient::messageReceived(const QByteArray &data)
@@ -309,16 +325,7 @@ void QmlProfilerTraceClient::messageReceived(const QByteArray &data)
d->maximumTime = qMax(d->currentEvent.event.timestamp(), d->maximumTime);
if (d->currentEvent.type.message() == Complete) {
while (!d->rangesInProgress.isEmpty()) {
d->currentEvent = d->rangesInProgress.top();
d->currentEvent.event.setRangeStage(RangeEnd);
d->currentEvent.event.setTimestamp(d->maximumTime);
d->processCurrentEvent();
}
QTC_CHECK(d->pendingMessages.isEmpty());
while (!d->pendingDebugMessages.isEmpty())
d->modelManager->addEvent(d->pendingDebugMessages.dequeue());
d->finalize();
emit complete(d->maximumTime);
} else if (d->currentEvent.type.message() == Event
&& d->currentEvent.type.detailType() == StartTrace) {

View File

@@ -60,12 +60,14 @@ void QmlProfilerTraceClientTest::testMessageReceived()
QByteArray trace;
inStream >> trace;
traceClient.stateChanged(QmlDebug::QmlDebugClient::Enabled);
QmlDebug::QPacket packet(QDataStream::Qt_4_7, trace);
while (!packet.atEnd()) {
QByteArray content;
packet >> content;
traceClient.messageReceived(content);
}
traceClient.stateChanged(QmlDebug::QmlDebugClient::NotConnected);
modelManager.replayEvents(-1, -1, [&](const QmlEvent &event, const QmlEventType &type) {
qint64 timestamp;