From a2581a2a89caa538972d2325bfdb17f3f71d24f4 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Thu, 8 Feb 2018 15:28:14 +0100 Subject: [PATCH] QmlProfiler: Use EngineControl to hold engines until we're done Holding the engines with EngineControl makes sure we always receive the full trace before the connection drops. Change-Id: I32e7d17886cdbc4749e3e54719e198d45169cbfe Task-number: QTBUG-66269 Reviewed-by: Christian Kandeler Reviewed-by: Christian Stenger Reviewed-by: Ulf Hermann --- .../qmlprofiler/qmlprofilertraceclient.cpp | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp index 6c859423d8e..15c6363ee16 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceclient.cpp @@ -77,6 +77,8 @@ public: QStack rangesInProgress; QQueue pendingMessages; QQueue pendingDebugMessages; + + QList trackedEngines; }; int QmlProfilerTraceClientPrivate::resolveType(const QmlTypedEvent &event) @@ -216,6 +218,22 @@ QmlProfilerTraceClient::QmlProfilerTraceClient(QmlDebug::QmlDebugConnection *cli setRequestedFeatures(features); connect(&d->engineControl, &QmlDebug::QmlEngineControlClient::engineAboutToBeAdded, this, &QmlProfilerTraceClient::sendRecordingStatus); + connect(&d->engineControl, &QmlDebug::QmlEngineControlClient::engineAboutToBeRemoved, + this, [this](int engineId) { + // We may already be done with that engine. Then we don't need to block it. + if (d->trackedEngines.contains(engineId)) + d->engineControl.blockEngine(engineId); + }); + connect(this, &QmlProfilerTraceClient::traceFinished, + &d->engineControl, [this](qint64 timestamp, const QList &engineIds) { + Q_UNUSED(timestamp); + // The engines might not be blocked because the trace can get finished before engine control + // sees them. + for (int blocked : d->engineControl.blockedEngines()) { + if (engineIds.contains(blocked)) + d->engineControl.releaseEngine(blocked); + } + }); } QmlProfilerTraceClient::~QmlProfilerTraceClient() @@ -243,6 +261,7 @@ void QmlProfilerTraceClient::clear() { d->eventTypeIds.clear(); d->serverTypeIds.clear(); + d->trackedEngines.clear(); clearEvents(); } @@ -334,12 +353,15 @@ void QmlProfilerTraceClient::messageReceived(const QByteArray &data) emit complete(d->maximumTime); } else if (d->currentEvent.type.message() == Event && d->currentEvent.type.detailType() == StartTrace) { - emit traceStarted(d->currentEvent.event.timestamp(), - d->currentEvent.event.numbers, qint32>()); + const QList engineIds = d->currentEvent.event.numbers, qint32>(); + d->trackedEngines.append(engineIds); + emit traceStarted(d->currentEvent.event.timestamp(), engineIds); } else if (d->currentEvent.type.message() == Event && d->currentEvent.type.detailType() == EndTrace) { - emit traceFinished(d->currentEvent.event.timestamp(), - d->currentEvent.event.numbers, qint32>()); + const QList engineIds = d->currentEvent.event.numbers, qint32>(); + for (int engineId : engineIds) + d->trackedEngines.removeAll(engineId); + emit traceFinished(d->currentEvent.event.timestamp(), engineIds); } else if (d->updateFeatures(d->currentEvent.type.feature())) { d->processCurrentEvent(); }