From 481e5257c9de4c76a8255eb033d5782aae9812e0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Fri, 21 Feb 2014 14:15:51 +0100 Subject: Don't needlessly flush start times when stopping profiling QQmlProfilerService::messageReceived() can call stopProfiling() multiple times in a row. If we flush the start times every time we get inconsistent data in the client. Profiler adapters should be removed from the start times when they're deleted, though. Task-number: QTCREATORBUG-11532 Change-Id: I6820971b7a93a7337cd8ad1b7b8b5aafdd654ab5 Reviewed-by: Kai Koehne --- src/qml/debugger/qqmlprofilerservice.cpp | 23 ++++++++++++++++------- src/qml/debugger/qqmlprofilerservice_p.h | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) (limited to 'src/qml/debugger') diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp index 5500b8f22c..fa34fb7898 100644 --- a/src/qml/debugger/qqmlprofilerservice.cpp +++ b/src/qml/debugger/qqmlprofilerservice.cpp @@ -157,8 +157,10 @@ void QQmlProfilerService::engineRemoved(QQmlEngine *engine) Q_ASSERT_X(QThread::currentThread() != thread(), Q_FUNC_INFO, "QML profilers have to be removed from the engine thread"); QMutexLocker lock(configMutex()); - foreach (QQmlAbstractProfilerAdapter *profiler, m_engineProfilers.values(engine)) + foreach (QQmlAbstractProfilerAdapter *profiler, m_engineProfilers.values(engine)) { + removeProfilerFromStartTimes(profiler); delete profiler; + } m_engineProfilers.remove(engine); } @@ -188,14 +190,22 @@ void QQmlProfilerService::addGlobalProfiler(QQmlAbstractProfilerAdapter *profile void QQmlProfilerService::removeGlobalProfiler(QQmlAbstractProfilerAdapter *profiler) { QMutexLocker lock(configMutex()); - for (QMultiMap::iterator i(m_startTimes.begin()); i != m_startTimes.end();) { - if (i.value() == profiler) + removeProfilerFromStartTimes(profiler); + m_globalProfilers.removeOne(profiler); + delete profiler; +} + +void QQmlProfilerService::removeProfilerFromStartTimes(const QQmlAbstractProfilerAdapter *profiler) +{ + for (QMultiMap::iterator i(m_startTimes.begin()); + i != m_startTimes.end();) { + if (i.value() == profiler) { m_startTimes.erase(i++); - else + break; + } else { ++i; + } } - m_globalProfilers.removeOne(profiler); - delete profiler; } void QQmlProfilerService::startProfiling(QQmlEngine *engine) @@ -223,7 +233,6 @@ void QQmlProfilerService::stopProfiling(QQmlEngine *engine) QMutexLocker lock(configMutex()); bool stillRunning = false; - m_startTimes.clear(); for (QMultiHash::iterator i(m_engineProfilers.begin()); i != m_engineProfilers.end(); ++i) { if (i.value()->isRunning()) { diff --git a/src/qml/debugger/qqmlprofilerservice_p.h b/src/qml/debugger/qqmlprofilerservice_p.h index 9e05424ce1..f278e139de 100644 --- a/src/qml/debugger/qqmlprofilerservice_p.h +++ b/src/qml/debugger/qqmlprofilerservice_p.h @@ -102,6 +102,7 @@ private: void sendMessages(); void addEngineProfiler(QQmlAbstractProfilerAdapter *profiler, QQmlEngine *engine); + void removeProfilerFromStartTimes(const QQmlAbstractProfilerAdapter *profiler); QElapsedTimer m_timer; -- cgit v1.2.3