diff options
author | Ulf Hermann <ulf.hermann@digia.com> | 2014-02-21 14:15:51 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-02-25 11:05:22 +0100 |
commit | 481e5257c9de4c76a8255eb033d5782aae9812e0 (patch) | |
tree | aeb413aaca936b1b6663c52d3d787bfff98c1e6c /src/qml/debugger/qqmlprofilerservice.cpp | |
parent | 90a7249e70b37f97907a28ccc6016064231eb861 (diff) |
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 <kai.koehne@digia.com>
Diffstat (limited to 'src/qml/debugger/qqmlprofilerservice.cpp')
-rw-r--r-- | src/qml/debugger/qqmlprofilerservice.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
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<qint64, QQmlAbstractProfilerAdapter *>::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<qint64, QQmlAbstractProfilerAdapter *>::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<QQmlEngine *, QQmlAbstractProfilerAdapter *>::iterator i(m_engineProfilers.begin()); i != m_engineProfilers.end(); ++i) { if (i.value()->isRunning()) { |