diff --git a/src/plugins/qmlprofiler/flamegraphmodel.cpp b/src/plugins/qmlprofiler/flamegraphmodel.cpp index 101cac1b6b0..d28cec914e6 100644 --- a/src/plugins/qmlprofiler/flamegraphmodel.cpp +++ b/src/plugins/qmlprofiler/flamegraphmodel.cpp @@ -51,7 +51,12 @@ FlameGraphModel::FlameGraphModel(QmlProfilerModelManager *modelManager, m_modelId = modelManager->registerModelProxy(); m_acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; - modelManager->announceFeatures(m_modelId, Constants::QML_JS_RANGE_FEATURES); + modelManager->announceFeatures(Constants::QML_JS_RANGE_FEATURES, + [this](const QmlEvent &event, const QmlEventType &type) { + loadEvent(event, type); + }, [this](){ + finalize(); + }); } void FlameGraphModel::clear() diff --git a/src/plugins/qmlprofiler/memoryusagemodel.cpp b/src/plugins/qmlprofiler/memoryusagemodel.cpp index 9937e1e6513..9ec47b694b7 100644 --- a/src/plugins/qmlprofiler/memoryusagemodel.cpp +++ b/src/plugins/qmlprofiler/memoryusagemodel.cpp @@ -33,7 +33,8 @@ namespace Internal { MemoryUsageModel::MemoryUsageModel(QmlProfilerModelManager *manager, QObject *parent) : QmlProfilerTimelineModel(manager, MemoryAllocation, MaximumRangeType, ProfileMemory, parent) { - announceFeatures((1ULL << mainFeature()) | Constants::QML_JS_RANGE_FEATURES); + // Announce additional features. The base class already announces the main feature. + announceFeatures(Constants::QML_JS_RANGE_FEATURES); } int MemoryUsageModel::rowMaxValue(int rowNumber) const diff --git a/src/plugins/qmlprofiler/qmleventtype.h b/src/plugins/qmlprofiler/qmleventtype.h index 5221091ecee..da22f83121f 100644 --- a/src/plugins/qmlprofiler/qmleventtype.h +++ b/src/plugins/qmlprofiler/qmleventtype.h @@ -46,6 +46,33 @@ struct QmlEventType { Message message; RangeType rangeType; int detailType; // can be EventType, BindingType, PixmapEventType or SceneGraphFrameType + + ProfileFeature feature() const + { + switch (message) { + case Event: { + switch (detailType) { + case Mouse: + case Key: + return ProfileInputEvents; + case AnimationFrame: + return ProfileAnimations; + default: + return MaximumProfileFeature; + } + } + case PixmapCacheEvent: + return ProfilePixmapCache; + case SceneGraphFrame: + return ProfileSceneGraph; + case MemoryAllocation: + return ProfileMemory; + case DebugMessage: + return ProfileDebugMessages; + default: + return featureFromRangeType(rangeType); + } + } }; QDataStream &operator>>(QDataStream &stream, QmlEventType &type); diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp index b194d937fb3..e3832d226ba 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp @@ -136,6 +136,9 @@ public: quint64 availableFeatures; quint64 visibleFeatures; quint64 recordedFeatures; + + QHash > eventLoaders; + QVector finalizers; }; @@ -182,9 +185,15 @@ int QmlProfilerModelManager::registerModelProxy() return d->numRegisteredModels++; } -void QmlProfilerModelManager::announceFeatures(int proxyId, quint64 features) +void QmlProfilerModelManager::dispatch(const QmlEvent &event, const QmlEventType &type) +{ + foreach (const EventLoader &loader, d->eventLoaders[type.feature()]) + loader(event, type); +} + +void QmlProfilerModelManager::announceFeatures(quint64 features, EventLoader eventLoader, + Finalizer finalizer) { - Q_UNUSED(proxyId); // Will use that later to optimize the event dispatching on loading. if ((features & d->availableFeatures) != features) { d->availableFeatures |= features; emit availableFeaturesChanged(d->availableFeatures); @@ -193,6 +202,13 @@ void QmlProfilerModelManager::announceFeatures(int proxyId, quint64 features) d->visibleFeatures |= features; emit visibleFeaturesChanged(d->visibleFeatures); } + + for (int feature = 0; feature != MaximumProfileFeature; ++feature) { + if (features & (1 << feature)) + d->eventLoaders[static_cast(feature)].append(eventLoader); + } + + d->finalizers.append(finalizer); } quint64 QmlProfilerModelManager::availableFeatures() const diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h index 66f11b7317f..92e5f7872c2 100644 --- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.h +++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.h @@ -28,10 +28,13 @@ #include "qmlprofiler_global.h" #include "qmlprofilereventtypes.h" #include "qmleventlocation.h" +#include "qmlevent.h" +#include "qmleventtype.h" #include #include +#include namespace QmlProfiler { class QmlProfilerModelManager; @@ -80,6 +83,9 @@ public: Done }; + typedef std::function EventLoader; + typedef std::function Finalizer; + explicit QmlProfilerModelManager(Utils::FileInProjectFinder *finder, QObject *parent = 0); ~QmlProfilerModelManager(); @@ -91,7 +97,10 @@ public: bool isEmpty() const; int registerModelProxy(); - void announceFeatures(int proxyId, quint64 features); + void announceFeatures(quint64 features, EventLoader eventLoader, Finalizer finalizer); + + void dispatch(const QmlEvent &event, const QmlEventType &type); + quint64 availableFeatures() const; quint64 visibleFeatures() const; void setVisibleFeatures(quint64 features); diff --git a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp index 72a122168c1..5ee49e123d3 100644 --- a/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerstatisticsmodel.cpp @@ -65,7 +65,12 @@ QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager * d->acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; - modelManager->announceFeatures(d->modelId, Constants::QML_JS_RANGE_FEATURES); + modelManager->announceFeatures(Constants::QML_JS_RANGE_FEATURES, + [this](const QmlEvent &event, const QmlEventType &type) { + loadEvent(event, type); + }, [this]() { + finalize(); + }); } QmlProfilerStatisticsModel::~QmlProfilerStatisticsModel() diff --git a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp index 6adba8327b0..31d3c81ba00 100644 --- a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.cpp @@ -80,9 +80,14 @@ QmlProfilerModelManager *QmlProfilerTimelineModel::modelManager() const return m_modelManager; } -void QmlProfilerTimelineModel::announceFeatures(quint64 features) const +void QmlProfilerTimelineModel::announceFeatures(quint64 features) { - m_modelManager->announceFeatures(modelId(), features); + m_modelManager->announceFeatures( + features, [this](const QmlEvent &event, const QmlEventType &type) { + loadEvent(event, type); + }, [this]() { + finalize(); + }); } void QmlProfilerTimelineModel::dataChanged() diff --git a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.h b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.h index 5f63ef7b769..fa9255efee2 100644 --- a/src/plugins/qmlprofiler/qmlprofilertimelinemodel.h +++ b/src/plugins/qmlprofiler/qmlprofilertimelinemodel.h @@ -64,7 +64,7 @@ private slots: void onVisibleFeaturesChanged(quint64 features); protected: - void announceFeatures(quint64 features) const; + void announceFeatures(quint64 features); private: const Message m_message;