aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmldebug
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2018-02-07 17:25:24 +0100
committerUlf Hermann <ulf.hermann@qt.io>2018-02-08 08:42:13 +0000
commit02c5209db58ae000bdd5066e9bc4cc6c875646f7 (patch)
tree2e666cb22d12f4b8c2d0e94becf84a2aed5f9e9f /src/qmldebug
parentcefd0913c302c0821a0d40e95f5f85113e9f17db (diff)
QmlDebug: Use EngineControl to hold engines until we're done with them
Holding the engines with EngineControl makes sure we always receive the full trace before the connection drops. Task-number: QTBUG-66269 Change-Id: I9177c2a52743ba781547696508342c8d98557121 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qmldebug')
-rw-r--r--src/qmldebug/qqmlprofilerclient.cpp27
-rw-r--r--src/qmldebug/qqmlprofilerclient_p_p.h2
2 files changed, 25 insertions, 4 deletions
diff --git a/src/qmldebug/qqmlprofilerclient.cpp b/src/qmldebug/qqmlprofilerclient.cpp
index dca564cd76..cbd0062ce6 100644
--- a/src/qmldebug/qqmlprofilerclient.cpp
+++ b/src/qmldebug/qqmlprofilerclient.cpp
@@ -168,6 +168,22 @@ QQmlProfilerClient::QQmlProfilerClient(QQmlDebugConnection *connection,
setRequestedFeatures(features);
connect(d->engineControl.data(), &QQmlEngineControlClient::engineAboutToBeAdded,
this, &QQmlProfilerClient::sendRecordingStatus);
+ connect(d->engineControl.data(), &QQmlEngineControlClient::engineAboutToBeRemoved,
+ this, [d](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, &QQmlProfilerClient::traceFinished,
+ d->engineControl.data(), [d](qint64 timestamp, const QList<int> &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);
+ }
+ });
}
QQmlProfilerClient::~QQmlProfilerClient()
@@ -322,12 +338,15 @@ void QQmlProfilerClient::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<QList<int>, qint32>());
+ const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, 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<QList<int>, qint32>());
+ const QList<int> engineIds = d->currentEvent.event.numbers<QList<int>, 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();
}
diff --git a/src/qmldebug/qqmlprofilerclient_p_p.h b/src/qmldebug/qqmlprofilerclient_p_p.h
index cf0145409a..0caef8e448 100644
--- a/src/qmldebug/qqmlprofilerclient_p_p.h
+++ b/src/qmldebug/qqmlprofilerclient_p_p.h
@@ -105,6 +105,8 @@ public:
QStack<QQmlProfilerTypedEvent> rangesInProgress;
QQueue<QQmlProfilerEvent> pendingMessages;
QQueue<QQmlProfilerEvent> pendingDebugMessages;
+
+ QList<int> trackedEngines;
};
QT_END_NAMESPACE