diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2018-11-01 10:58:31 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2018-11-15 14:21:54 +0000 |
commit | 71645c45b9880d1a349c9a41a73d455f31c9de75 (patch) | |
tree | f3c0474e66697573ef5debefd653e777677b54a8 /src/qmldebug | |
parent | 0647853c1659515684da1fb0f44d12eac993dc69 (diff) |
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>
Diffstat (limited to 'src/qmldebug')
-rw-r--r-- | src/qmldebug/qqmlprofilerclient.cpp | 16 | ||||
-rw-r--r-- | src/qmldebug/qqmlprofilerclient_p_p.h | 1 |
2 files changed, 12 insertions, 5 deletions
diff --git a/src/qmldebug/qqmlprofilerclient.cpp b/src/qmldebug/qqmlprofilerclient.cpp index 73db2ad94d..5477af89d4 100644 --- a/src/qmldebug/qqmlprofilerclient.cpp +++ b/src/qmldebug/qqmlprofilerclient.cpp @@ -95,11 +95,16 @@ 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(); diff --git a/src/qmldebug/qqmlprofilerclient_p_p.h b/src/qmldebug/qqmlprofilerclient_p_p.h index df73209858..52d42eae82 100644 --- a/src/qmldebug/qqmlprofilerclient_p_p.h +++ b/src/qmldebug/qqmlprofilerclient_p_p.h @@ -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(); |