diff options
author | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-02-08 21:27:57 +0100 |
---|---|---|
committer | Qt Forward Merge Bot <qt_forward_merge_bot@qt-project.org> | 2018-02-08 21:27:57 +0100 |
commit | 6059f6f2a485ca3dddfedc55536e4f62f349a990 (patch) | |
tree | c86f5ec9be36071ec2da7371df03d1478b2a7bf1 /src/qmldebug | |
parent | 62cf41dba5d037fb51224814dde12ad174ce4e72 (diff) | |
parent | 5cef1f6b505939976684c00e8deee614f2c20928 (diff) |
Merge remote-tracking branch 'origin/5.11' into dev
Change-Id: I32ae7587ddd92c53d078dc5bb69ca9281f801612
Diffstat (limited to 'src/qmldebug')
-rw-r--r-- | src/qmldebug/qqmlenginecontrolclient.cpp | 31 | ||||
-rw-r--r-- | src/qmldebug/qqmlprofilerclient.cpp | 28 | ||||
-rw-r--r-- | src/qmldebug/qqmlprofilerclient_p_p.h | 2 |
3 files changed, 44 insertions, 17 deletions
diff --git a/src/qmldebug/qqmlenginecontrolclient.cpp b/src/qmldebug/qqmlenginecontrolclient.cpp index fef4c81d93..8d62fafb94 100644 --- a/src/qmldebug/qqmlenginecontrolclient.cpp +++ b/src/qmldebug/qqmlenginecontrolclient.cpp @@ -108,32 +108,37 @@ void QQmlEngineControlClient::messageReceived(const QByteArray &data) if (!stream.atEnd()) stream >> name; - QQmlEngineControlClientPrivate::EngineState &state = d->blockedEngines[id]; - Q_ASSERT(state.blockers == 0); - Q_ASSERT(state.releaseCommand == QQmlEngineControlClientPrivate::InvalidCommand); + auto handleWaiting = [&]( + QQmlEngineControlClientPrivate::CommandType command, std::function<void()> emitter) { + QQmlEngineControlClientPrivate::EngineState &state = d->blockedEngines[id]; + Q_ASSERT(state.blockers == 0); + Q_ASSERT(state.releaseCommand == QQmlEngineControlClientPrivate::InvalidCommand); + state.releaseCommand = command; + emitter(); + if (state.blockers == 0) { + d->sendCommand(state.releaseCommand, id); + d->blockedEngines.remove(id); + } + }; switch (message) { case QQmlEngineControlClientPrivate::EngineAboutToBeAdded: - state.releaseCommand = QQmlEngineControlClientPrivate::StartWaitingEngine; - emit engineAboutToBeAdded(id, name); + handleWaiting(QQmlEngineControlClientPrivate::StartWaitingEngine, [&](){ + emit engineAboutToBeAdded(id, name); + }); break; case QQmlEngineControlClientPrivate::EngineAdded: emit engineAdded(id, name); break; case QQmlEngineControlClientPrivate::EngineAboutToBeRemoved: - state.releaseCommand = QQmlEngineControlClientPrivate::StopWaitingEngine; - emit engineAboutToBeRemoved(id, name); + handleWaiting(QQmlEngineControlClientPrivate::StopWaitingEngine, [&](){ + emit engineAboutToBeRemoved(id, name); + }); break; case QQmlEngineControlClientPrivate::EngineRemoved: emit engineRemoved(id, name); break; } - - if (state.blockers == 0 && - state.releaseCommand != QQmlEngineControlClientPrivate::InvalidCommand) { - d->sendCommand(state.releaseCommand, id); - d->blockedEngines.remove(id); - } } QQmlEngineControlClientPrivate::QQmlEngineControlClientPrivate(QQmlDebugConnection *connection) : diff --git a/src/qmldebug/qqmlprofilerclient.cpp b/src/qmldebug/qqmlprofilerclient.cpp index 1eaa3e7667..356190f2b0 100644 --- a/src/qmldebug/qqmlprofilerclient.cpp +++ b/src/qmldebug/qqmlprofilerclient.cpp @@ -172,6 +172,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() @@ -200,6 +216,7 @@ void QQmlProfilerClient::clearAll() Q_D(QQmlProfilerClient); d->serverTypeIds.clear(); d->eventTypeIds.clear(); + d->trackedEngines.clear(); clearEvents(); } @@ -326,12 +343,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 b90793d733..99fe47301b 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 |