diff options
Diffstat (limited to 'tools/qmlprofiler/qmlprofilerclient.cpp')
-rw-r--r-- | tools/qmlprofiler/qmlprofilerclient.cpp | 102 |
1 files changed, 52 insertions, 50 deletions
diff --git a/tools/qmlprofiler/qmlprofilerclient.cpp b/tools/qmlprofiler/qmlprofilerclient.cpp index 711ddbd862..4976a5a0d9 100644 --- a/tools/qmlprofiler/qmlprofilerclient.cpp +++ b/tools/qmlprofiler/qmlprofilerclient.cpp @@ -39,17 +39,12 @@ ProfilerClient::ProfilerClient(const QString &clientName, QQmlDebugConnection *client) : QQmlDebugClient(clientName, client), - m_recording(false), m_enabled(false) { } ProfilerClient::~ProfilerClient() { - //Disable profiling if started by client - //Profiling data will be lost!! - if (isRecording()) - setRecording(false); } void ProfilerClient::clearData() @@ -62,29 +57,6 @@ bool ProfilerClient::isEnabled() const return m_enabled; } -void ProfilerClient::sendRecordingStatus() -{ -} - -bool ProfilerClient::isRecording() const -{ - return m_recording; -} - -void ProfilerClient::setRecording(bool v) -{ - if (v == m_recording) - return; - - m_recording = v; - - if (state() == Enabled) { - sendRecordingStatus(); - } - - emit recordingChanged(v); -} - void ProfilerClient::stateChanged(State status) { if ((m_enabled && status != Enabled) || @@ -99,8 +71,7 @@ class QmlProfilerClientPrivate { public: QmlProfilerClientPrivate() - : inProgressRanges(0) - , maximumTime(0) + : inProgressRanges(0) , features(std::numeric_limits<quint64>::max()) { ::memset(rangeCount, 0, QQmlProfilerService::MaximumRangeType * sizeof(int)); @@ -112,7 +83,8 @@ public: QStack<QmlEventLocation> rangeLocations[QQmlProfilerService::MaximumRangeType]; QStack<QQmlProfilerService::BindingType> bindingTypes; int rangeCount[QQmlProfilerService::MaximumRangeType]; - qint64 maximumTime; + + quint64 features; }; QmlProfilerClient::QmlProfilerClient( @@ -127,6 +99,11 @@ QmlProfilerClient::~QmlProfilerClient() delete d; } +void QmlProfilerClient::setFeatures(quint64 features) +{ + d->features = features; +} + void QmlProfilerClient::clearData() { ::memset(d->rangeCount, 0, @@ -135,19 +112,43 @@ void QmlProfilerClient::clearData() ProfilerClient::clearData(); } -void QmlProfilerClient::sendRecordingStatus() +void QmlProfilerClient::sendRecordingStatus(bool record) { QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); - stream << isRecording(); + stream << record << -1 << d->features; sendMessage(ba); } +inline QQmlProfilerService::ProfileFeature featureFromRangeType( + QQmlProfilerService::RangeType range) +{ + switch (range) { + case QQmlProfilerService::Painting: + return QQmlProfilerService::ProfilePainting; + case QQmlProfilerService::Compiling: + return QQmlProfilerService::ProfileCompiling; + case QQmlProfilerService::Creating: + return QQmlProfilerService::ProfileCreating; + case QQmlProfilerService::Binding: + return QQmlProfilerService::ProfileBinding; + case QQmlProfilerService::HandlingSignal: + return QQmlProfilerService::ProfileHandlingSignal; + case QQmlProfilerService::Javascript: + return QQmlProfilerService::ProfileJavaScript; + default: + return QQmlProfilerService::MaximumProfileFeature; + } +} + void QmlProfilerClient::messageReceived(const QByteArray &data) { QByteArray rwData = data; QDataStream stream(&rwData, QIODevice::ReadOnly); + // Force all the 1 << <FLAG> expressions to be done in 64 bit, to silence some warnings + const quint64 one = static_cast<quint64>(1); + qint64 time; int messageType; @@ -162,25 +163,27 @@ void QmlProfilerClient::messageReceived(const QByteArray &data) if (event == QQmlProfilerService::EndTrace) { emit this->traceFinished(time); - d->maximumTime = time; - d->maximumTime = qMax(time, d->maximumTime); } else if (event == QQmlProfilerService::AnimationFrame) { + if (!(d->features & one << QQmlProfilerService::ProfileAnimations)) + return; int frameRate, animationCount; int threadId = 0; stream >> frameRate >> animationCount; if (!stream.atEnd()) stream >> threadId; emit this->frame(time, frameRate, animationCount, threadId); - d->maximumTime = qMax(time, d->maximumTime); } else if (event == QQmlProfilerService::StartTrace) { emit this->traceStarted(time); - d->maximumTime = time; - } else if (event < QQmlProfilerService::MaximumEventType) { - d->maximumTime = qMax(time, d->maximumTime); + } else if (event == QQmlProfilerService::Key || event == QQmlProfilerService::Mouse) { + if (!(d->features & one << QQmlProfilerService::ProfileInputEvents)) + return; + emit this->inputEvent((QQmlProfilerService::EventType)event, time); } } else if (messageType == QQmlProfilerService::Complete) { emit complete(); } else if (messageType == QQmlProfilerService::SceneGraphFrame) { + if (!(d->features & one << QQmlProfilerService::ProfileSceneGraph)) + return; int sgEventType; int count = 0; qint64 params[5]; @@ -193,8 +196,9 @@ void QmlProfilerClient::messageReceived(const QByteArray &data) params[count++] = 0; emit sceneGraphFrame((QQmlProfilerService::SceneGraphFrameType)sgEventType, time, params[0], params[1], params[2], params[3], params[4]); - d->maximumTime = qMax(time, d->maximumTime); } else if (messageType == QQmlProfilerService::PixmapCacheEvent) { + if (!(d->features & one << QQmlProfilerService::ProfilePixmapCache)) + return; int pixEvTy, width = 0, height = 0, refcount = 0; QString pixUrl; stream >> pixEvTy >> pixUrl; @@ -207,13 +211,13 @@ void QmlProfilerClient::messageReceived(const QByteArray &data) } emit pixmapCache((QQmlProfilerService::PixmapEventType)pixEvTy, time, QmlEventLocation(pixUrl,0,0), width, height, refcount); - d->maximumTime = qMax(time, d->maximumTime); } else if (messageType == QQmlProfilerService::MemoryAllocation) { + if (!(d->features & one << QQmlProfilerService::ProfileMemory)) + return; int type; qint64 delta; stream >> type >> delta; emit memoryAllocation((QQmlProfilerService::MemoryType)type, time, delta); - d->maximumTime = qMax(time, d->maximumTime); } else { int range; stream >> range; @@ -221,6 +225,10 @@ void QmlProfilerClient::messageReceived(const QByteArray &data) if (range >= QQmlProfilerService::MaximumRangeType) return; + if (!(d->features & one << featureFromRangeType( + static_cast<QQmlProfilerService::RangeType>(range)))) + return; + if (messageType == QQmlProfilerService::RangeStart) { d->rangeStartTimes[range].push(time); d->inProgressRanges |= (static_cast<qint64>(1) << range); @@ -263,7 +271,6 @@ void QmlProfilerClient::messageReceived(const QByteArray &data) if (d->inProgressRanges & (static_cast<qint64>(1) << range)) d->inProgressRanges &= ~(static_cast<qint64>(1) << range); - d->maximumTime = qMax(time, d->maximumTime); QStringList data = d->rangeDatas[range].count() ? d->rangeDatas[range].pop() : QStringList(); QmlEventLocation location = d->rangeLocations[range].count() ? @@ -296,19 +303,14 @@ V8ProfilerClient::~V8ProfilerClient() { } -void V8ProfilerClient::sendRecordingStatus() +void V8ProfilerClient::sendRecordingStatus(bool record) { QByteArray ba; QDataStream stream(&ba, QIODevice::WriteOnly); QByteArray cmd("V8PROFILER"); - QByteArray option(""); + QByteArray option(record ? "start" : "stop"); QByteArray title(""); - if (m_recording) { - option = "start"; - } else { - option = "stop"; - } stream << cmd << option << title; sendMessage(ba); } |