diff --git a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp index 1d40bfda394..31c664e5c78 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp @@ -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) { diff --git a/src/plugins/qmlprofiler/tests/check.dat b/src/plugins/qmlprofiler/tests/check.dat index c1dd548894c..7431903a1e9 100644 Binary files a/src/plugins/qmlprofiler/tests/check.dat and b/src/plugins/qmlprofiler/tests/check.dat differ diff --git a/src/plugins/qmlprofiler/tests/qmlprofilertraceclient_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilertraceclient_test.cpp index e8781e790c5..2fc27ae4f92 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilertraceclient_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilertraceclient_test.cpp @@ -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;