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 <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Ulf Hermann
2016-07-06 14:03:32 +02:00
parent 0d698d6b70
commit eae76df140

View File

@@ -32,6 +32,8 @@
#include <qmldebug/qpacketprotocol.h> #include <qmldebug/qpacketprotocol.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QQueue>
namespace QmlProfiler { namespace QmlProfiler {
class QmlProfilerTraceClientPrivate { class QmlProfilerTraceClientPrivate {
@@ -70,6 +72,7 @@ public:
QHash<QmlEventType, int> eventTypeIds; QHash<QmlEventType, int> eventTypeIds;
QHash<qint64, int> serverTypeIds; QHash<qint64, int> serverTypeIds;
QStack<QmlTypedEvent> rangesInProgress; QStack<QmlTypedEvent> rangesInProgress;
QQueue<QmlEvent> pendingMessages;
}; };
int QmlProfilerTraceClientPrivate::resolveType(const QmlTypedEvent &event) int QmlProfilerTraceClientPrivate::resolveType(const QmlTypedEvent &event)
@@ -109,6 +112,10 @@ int QmlProfilerTraceClientPrivate::resolveStackTop()
typeIndex = resolveType(typedEvent); typeIndex = resolveType(typedEvent);
typedEvent.event.setTypeIndex(typeIndex); typedEvent.event.setTypeIndex(typeIndex);
while (!pendingMessages.isEmpty()
&& pendingMessages.head().timestamp() < typedEvent.event.timestamp()) {
model->addEvent(pendingMessages.dequeue());
}
model->addEvent(typedEvent.event); model->addEvent(typedEvent.event);
return typeIndex; return typeIndex;
} }
@@ -130,6 +137,8 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
int typeIndex = resolveStackTop(); int typeIndex = resolveStackTop();
QTC_ASSERT(typeIndex != -1, break); QTC_ASSERT(typeIndex != -1, break);
currentEvent.event.setTypeIndex(typeIndex); currentEvent.event.setTypeIndex(typeIndex);
while (!pendingMessages.isEmpty())
model->addEvent(pendingMessages.dequeue());
model->addEvent(currentEvent.event); model->addEvent(currentEvent.event);
rangesInProgress.pop(); rangesInProgress.pop();
break; break;
@@ -143,7 +152,10 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
default: { default: {
int typeIndex = resolveType(currentEvent); int typeIndex = resolveType(currentEvent);
currentEvent.event.setTypeIndex(typeIndex); currentEvent.event.setTypeIndex(typeIndex);
model->addEvent(currentEvent.event); if (rangesInProgress.isEmpty())
model->addEvent(currentEvent.event);
else
pendingMessages.enqueue(currentEvent.event);
break; break;
} }
} }
@@ -281,6 +293,12 @@ 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->currentEvent = d->rangesInProgress.top();
d->currentEvent.event.setRangeStage(RangeEnd);
d->currentEvent.event.setTimestamp(d->maximumTime);
d->processCurrentEvent();
}
emit complete(d->maximumTime); emit complete(d->maximumTime);
setRecordingFromServer(false); setRecordingFromServer(false);
} else if (d->currentEvent.type.message() == Event } else if (d->currentEvent.type.message() == Event