aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/debugger/qqmlprofilerservice.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@digia.com>2014-02-21 14:15:51 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-25 11:05:22 +0100
commit481e5257c9de4c76a8255eb033d5782aae9812e0 (patch)
treeaeb413aaca936b1b6663c52d3d787bfff98c1e6c /src/qml/debugger/qqmlprofilerservice.cpp
parent90a7249e70b37f97907a28ccc6016064231eb861 (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.cpp23
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()) {