From eae76df14000d490eada46749dbdc73fd0544168 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 6 Jul 2016 14:03:32 +0200 Subject: [PATCH] QmlProfiler: Don't reorder events in trace client We stash the ranges until we receive RangeLocation and RangeData. In order not to send other messages before the range they belong to, we need to keep them around, too, until we send the range. Change-Id: I0ce4ced68ee343c54638ce262216c4bf1e4ddc13 Reviewed-by: Christian Kandeler Reviewed-by: Ulf Hermann --- .../qmlprofiler/qmlprofilertraceclient.cpp | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp index 4c586a37eaf..0e8b16d444d 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp @@ -32,6 +32,8 @@ #include #include +#include + namespace QmlProfiler { class QmlProfilerTraceClientPrivate { @@ -70,6 +72,7 @@ public: QHash eventTypeIds; QHash serverTypeIds; QStack rangesInProgress; + QQueue pendingMessages; }; int QmlProfilerTraceClientPrivate::resolveType(const QmlTypedEvent &event) @@ -109,6 +112,10 @@ int QmlProfilerTraceClientPrivate::resolveStackTop() typeIndex = resolveType(typedEvent); typedEvent.event.setTypeIndex(typeIndex); + while (!pendingMessages.isEmpty() + && pendingMessages.head().timestamp() < typedEvent.event.timestamp()) { + model->addEvent(pendingMessages.dequeue()); + } model->addEvent(typedEvent.event); return typeIndex; } @@ -130,6 +137,8 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent() int typeIndex = resolveStackTop(); QTC_ASSERT(typeIndex != -1, break); currentEvent.event.setTypeIndex(typeIndex); + while (!pendingMessages.isEmpty()) + model->addEvent(pendingMessages.dequeue()); model->addEvent(currentEvent.event); rangesInProgress.pop(); break; @@ -143,7 +152,10 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent() default: { int typeIndex = resolveType(currentEvent); currentEvent.event.setTypeIndex(typeIndex); - model->addEvent(currentEvent.event); + if (rangesInProgress.isEmpty()) + model->addEvent(currentEvent.event); + else + pendingMessages.enqueue(currentEvent.event); break; } } @@ -281,6 +293,12 @@ 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(); + } emit complete(d->maximumTime); setRecordingFromServer(false); } else if (d->currentEvent.type.message() == Event