forked from qt-creator/qt-creator
QmlProfiler: Process remaining events if connection drops
When the connection drops while receiving a trace we can easily process the buffered events. The trace client test case has some traces with trailing open ranges that can be recovered this way. Change-Id: I8b2ecc135b0cabff18923fbc8f3f14b5cb3a96ee Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -58,6 +58,7 @@ public:
|
|||||||
int resolveStackTop();
|
int resolveStackTop();
|
||||||
void forwardEvents(const QmlEvent &last);
|
void forwardEvents(const QmlEvent &last);
|
||||||
void processCurrentEvent();
|
void processCurrentEvent();
|
||||||
|
void finalize();
|
||||||
|
|
||||||
QmlProfilerTraceClient *q;
|
QmlProfilerTraceClient *q;
|
||||||
QmlProfilerModelManager *modelManager;
|
QmlProfilerModelManager *modelManager;
|
||||||
@@ -182,6 +183,19 @@ void QmlProfilerTraceClientPrivate::processCurrentEvent()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QmlProfilerTraceClientPrivate::finalize()
|
||||||
|
{
|
||||||
|
while (!rangesInProgress.isEmpty()) {
|
||||||
|
currentEvent = rangesInProgress.top();
|
||||||
|
currentEvent.event.setRangeStage(RangeEnd);
|
||||||
|
currentEvent.event.setTimestamp(maximumTime);
|
||||||
|
processCurrentEvent();
|
||||||
|
}
|
||||||
|
QTC_CHECK(pendingMessages.isEmpty());
|
||||||
|
while (!pendingDebugMessages.isEmpty())
|
||||||
|
modelManager->addEvent(pendingDebugMessages.dequeue());
|
||||||
|
}
|
||||||
|
|
||||||
void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
|
void QmlProfilerTraceClientPrivate::sendRecordingStatus(int engineId)
|
||||||
{
|
{
|
||||||
QmlDebug::QPacket stream(q->dataStreamVersion());
|
QmlDebug::QPacket stream(q->dataStreamVersion());
|
||||||
@@ -299,6 +313,8 @@ void QmlProfilerTraceClient::stateChanged(State status)
|
|||||||
{
|
{
|
||||||
if (status == Enabled)
|
if (status == Enabled)
|
||||||
sendRecordingStatus(-1);
|
sendRecordingStatus(-1);
|
||||||
|
else
|
||||||
|
d->finalize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlProfilerTraceClient::messageReceived(const QByteArray &data)
|
void QmlProfilerTraceClient::messageReceived(const QByteArray &data)
|
||||||
@@ -309,16 +325,7 @@ 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->finalize();
|
||||||
d->currentEvent = d->rangesInProgress.top();
|
|
||||||
d->currentEvent.event.setRangeStage(RangeEnd);
|
|
||||||
d->currentEvent.event.setTimestamp(d->maximumTime);
|
|
||||||
d->processCurrentEvent();
|
|
||||||
}
|
|
||||||
QTC_CHECK(d->pendingMessages.isEmpty());
|
|
||||||
while (!d->pendingDebugMessages.isEmpty())
|
|
||||||
d->modelManager->addEvent(d->pendingDebugMessages.dequeue());
|
|
||||||
|
|
||||||
emit complete(d->maximumTime);
|
emit complete(d->maximumTime);
|
||||||
} else if (d->currentEvent.type.message() == Event
|
} else if (d->currentEvent.type.message() == Event
|
||||||
&& d->currentEvent.type.detailType() == StartTrace) {
|
&& d->currentEvent.type.detailType() == StartTrace) {
|
||||||
|
|||||||
Binary file not shown.
@@ -60,12 +60,14 @@ void QmlProfilerTraceClientTest::testMessageReceived()
|
|||||||
QByteArray trace;
|
QByteArray trace;
|
||||||
inStream >> trace;
|
inStream >> trace;
|
||||||
|
|
||||||
|
traceClient.stateChanged(QmlDebug::QmlDebugClient::Enabled);
|
||||||
QmlDebug::QPacket packet(QDataStream::Qt_4_7, trace);
|
QmlDebug::QPacket packet(QDataStream::Qt_4_7, trace);
|
||||||
while (!packet.atEnd()) {
|
while (!packet.atEnd()) {
|
||||||
QByteArray content;
|
QByteArray content;
|
||||||
packet >> content;
|
packet >> content;
|
||||||
traceClient.messageReceived(content);
|
traceClient.messageReceived(content);
|
||||||
}
|
}
|
||||||
|
traceClient.stateChanged(QmlDebug::QmlDebugClient::NotConnected);
|
||||||
|
|
||||||
modelManager.replayEvents(-1, -1, [&](const QmlEvent &event, const QmlEventType &type) {
|
modelManager.replayEvents(-1, -1, [&](const QmlEvent &event, const QmlEventType &type) {
|
||||||
qint64 timestamp;
|
qint64 timestamp;
|
||||||
|
|||||||
Reference in New Issue
Block a user