forked from qt-creator/qt-creator
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:
@@ -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
|
||||||
|
Reference in New Issue
Block a user