QmlProfiler: Methods for dispatching events by feature

When announcing features models have to provide functions that handle
events for those features now. The model manager gets a function to
dispatch events to the models that subscribe to them.

Change-Id: I3fd80443a68ba264a513d8d53ed473cf072f1dc7
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
Ulf Hermann
2016-04-28 16:19:17 +02:00
parent 911c8842b2
commit 1e8996b438
8 changed files with 77 additions and 9 deletions

View File

@@ -51,7 +51,12 @@ FlameGraphModel::FlameGraphModel(QmlProfilerModelManager *modelManager,
m_modelId = modelManager->registerModelProxy(); m_modelId = modelManager->registerModelProxy();
m_acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; 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() void FlameGraphModel::clear()

View File

@@ -33,7 +33,8 @@ namespace Internal {
MemoryUsageModel::MemoryUsageModel(QmlProfilerModelManager *manager, QObject *parent) : MemoryUsageModel::MemoryUsageModel(QmlProfilerModelManager *manager, QObject *parent) :
QmlProfilerTimelineModel(manager, MemoryAllocation, MaximumRangeType, ProfileMemory, 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 int MemoryUsageModel::rowMaxValue(int rowNumber) const

View File

@@ -46,6 +46,33 @@ struct QmlEventType {
Message message; Message message;
RangeType rangeType; RangeType rangeType;
int detailType; // can be EventType, BindingType, PixmapEventType or SceneGraphFrameType 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); QDataStream &operator>>(QDataStream &stream, QmlEventType &type);

View File

@@ -136,6 +136,9 @@ public:
quint64 availableFeatures; quint64 availableFeatures;
quint64 visibleFeatures; quint64 visibleFeatures;
quint64 recordedFeatures; quint64 recordedFeatures;
QHash<ProfileFeature, QVector<EventLoader> > eventLoaders;
QVector<Finalizer> finalizers;
}; };
@@ -182,9 +185,15 @@ int QmlProfilerModelManager::registerModelProxy()
return d->numRegisteredModels++; 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) { if ((features & d->availableFeatures) != features) {
d->availableFeatures |= features; d->availableFeatures |= features;
emit availableFeaturesChanged(d->availableFeatures); emit availableFeaturesChanged(d->availableFeatures);
@@ -193,6 +202,13 @@ void QmlProfilerModelManager::announceFeatures(int proxyId, quint64 features)
d->visibleFeatures |= features; d->visibleFeatures |= features;
emit visibleFeaturesChanged(d->visibleFeatures); emit visibleFeaturesChanged(d->visibleFeatures);
} }
for (int feature = 0; feature != MaximumProfileFeature; ++feature) {
if (features & (1 << feature))
d->eventLoaders[static_cast<ProfileFeature>(feature)].append(eventLoader);
}
d->finalizers.append(finalizer);
} }
quint64 QmlProfilerModelManager::availableFeatures() const quint64 QmlProfilerModelManager::availableFeatures() const

View File

@@ -28,10 +28,13 @@
#include "qmlprofiler_global.h" #include "qmlprofiler_global.h"
#include "qmlprofilereventtypes.h" #include "qmlprofilereventtypes.h"
#include "qmleventlocation.h" #include "qmleventlocation.h"
#include "qmlevent.h"
#include "qmleventtype.h"
#include <utils/fileinprojectfinder.h> #include <utils/fileinprojectfinder.h>
#include <QObject> #include <QObject>
#include <functional>
namespace QmlProfiler { namespace QmlProfiler {
class QmlProfilerModelManager; class QmlProfilerModelManager;
@@ -80,6 +83,9 @@ public:
Done Done
}; };
typedef std::function<void(const QmlEvent &, const QmlEventType &)> EventLoader;
typedef std::function<void()> Finalizer;
explicit QmlProfilerModelManager(Utils::FileInProjectFinder *finder, QObject *parent = 0); explicit QmlProfilerModelManager(Utils::FileInProjectFinder *finder, QObject *parent = 0);
~QmlProfilerModelManager(); ~QmlProfilerModelManager();
@@ -91,7 +97,10 @@ public:
bool isEmpty() const; bool isEmpty() const;
int registerModelProxy(); 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 availableFeatures() const;
quint64 visibleFeatures() const; quint64 visibleFeatures() const;
void setVisibleFeatures(quint64 features); void setVisibleFeatures(quint64 features);

View File

@@ -65,7 +65,12 @@ QmlProfilerStatisticsModel::QmlProfilerStatisticsModel(QmlProfilerModelManager *
d->acceptedTypes << Compiling << Creating << Binding << HandlingSignal << Javascript; 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() QmlProfilerStatisticsModel::~QmlProfilerStatisticsModel()

View File

@@ -80,9 +80,14 @@ QmlProfilerModelManager *QmlProfilerTimelineModel::modelManager() const
return m_modelManager; 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() void QmlProfilerTimelineModel::dataChanged()

View File

@@ -64,7 +64,7 @@ private slots:
void onVisibleFeaturesChanged(quint64 features); void onVisibleFeaturesChanged(quint64 features);
protected: protected:
void announceFeatures(quint64 features) const; void announceFeatures(quint64 features);
private: private:
const Message m_message; const Message m_message;