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(); int resolveStackTop();
void forwardEvents(const QmlEvent &last); void forwardEvents(const QmlEvent &last);
void processCurrentEvent(); void processCurrentEvent();
void finalize();
QmlProfilerTraceClient *q; QmlProfilerTraceClient *q;
QmlProfilerModelManager *modelManager; 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) void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
{ {
QmlDebug::QPacket stream(q->dataStreamVersion()); QmlDebug::QPacket stream(q->dataStreamVersion());
@@ -299,6 +313,8 @@ void QmlProfilerTraceClient::stateChanged(State status)
{ {
if (status == Enabled) if (status == Enabled)
sendRecordingStatus(-1); sendRecordingStatus(-1);
else
d->finalize();
} }
void QmlProfilerTraceClient::messageReceived(const QByteArray &data) 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); d->maximumTime = qMax(d->currentEvent.event.timestamp(), d->maximumTime);
if (d->currentEvent.type.message() == Complete) { if (d->currentEvent.type.message() == Complete) {
while (!d->rangesInProgress.isEmpty()) { d->finalize();
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());
emit complete(d->maximumTime); emit complete(d->maximumTime);
} else if (d->currentEvent.type.message() == Event } else if (d->currentEvent.type.message() == Event
&& d->currentEvent.type.detailType() == StartTrace) { && d->currentEvent.type.detailType() == StartTrace) {

View File

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