Qml Tooling: Correctly sort debug messages into traces

Debug messages are sent from a different debug service and generally
arrive before they are "due". Therefore we buffer them and pass them on
when the trace has advanced to their position. However, we forgot some
places where we needed to check if there are pending debug messages to
be sent.

Change-Id: Ia6263086a9d06ae7c77c9e2afa85e6e1d8c8a19b
Reviewed-by: Michael Brasser <michael.brasser@live.com>
This commit is contained in:
Ulf Hermann 2018-11-01 10:58:31 +01:00
parent 0647853c16
commit 71645c45b9
2 changed files with 12 additions and 5 deletions

View File

@ -94,12 +94,17 @@ int QQmlProfilerClientPrivate::resolveStackTop()
}
void QQmlProfilerClientPrivate::forwardEvents(const QQmlProfilerEvent &last)
{
forwardDebugMessages(last.timestamp());
eventReceiver->addEvent(last);
}
void QQmlProfilerClientPrivate::forwardDebugMessages(qint64 untilTimestamp)
{
while (!pendingDebugMessages.isEmpty()
&& pendingDebugMessages.front().timestamp() <= last.timestamp()) {
&& pendingDebugMessages.front().timestamp() <= untilTimestamp) {
eventReceiver->addEvent(pendingDebugMessages.dequeue());
}
eventReceiver->addEvent(last);
}
void QQmlProfilerClientPrivate::processCurrentEvent()
@ -142,7 +147,7 @@ void QQmlProfilerClientPrivate::processCurrentEvent()
int typeIndex = resolveType(currentEvent);
currentEvent.event.setTypeIndex(typeIndex);
if (rangesInProgress.isEmpty())
eventReceiver->addEvent(currentEvent.event);
forwardEvents(currentEvent.event);
else
pendingMessages.enqueue(currentEvent.event);
break;
@ -228,8 +233,7 @@ void QQmlProfilerClientPrivate::finalize()
currentEvent.event.setTimestamp(maximumTime);
processCurrentEvent();
}
while (!pendingDebugMessages.isEmpty())
eventReceiver->addEvent(pendingDebugMessages.dequeue());
forwardDebugMessages(std::numeric_limits<qint64>::max());
}
@ -345,12 +349,14 @@ void QQmlProfilerClient::messageReceived(const QByteArray &data)
&& d->currentEvent.type.detailType() == StartTrace) {
const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, qint32>();
d->trackedEngines.append(engineIds);
d->forwardDebugMessages(d->currentEvent.event.timestamp());
emit traceStarted(d->currentEvent.event.timestamp(), engineIds);
} else if (d->currentEvent.type.message() == Event
&& d->currentEvent.type.detailType() == EndTrace) {
const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, qint32>();
for (int engineId : engineIds)
d->trackedEngines.removeAll(engineId);
d->forwardDebugMessages(d->currentEvent.event.timestamp());
emit traceFinished(d->currentEvent.event.timestamp(), engineIds);
} else if (d->updateFeatures(d->currentEvent.type.feature())) {
d->processCurrentEvent();

View File

@ -86,6 +86,7 @@ public:
int resolveType(const QQmlProfilerTypedEvent &type);
int resolveStackTop();
void forwardEvents(const QQmlProfilerEvent &last);
void forwardDebugMessages(qint64 untilTimestamp);
void processCurrentEvent();
void finalize();