QmlProfiler: storing binding type
authorChristiaan Janssen <christiaan.janssen@nokia.com>
Wed, 2 May 2012 15:32:57 +0000 (17:32 +0200)
committerQt by Nokia <qt-info@nokia.com>
Fri, 4 May 2012 13:19:25 +0000 (15:19 +0200)
Change-Id: If1f02e1e6f6ce6aba9874a63d01a08d57571f991
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
src/qml/debugger/qqmlprofilerservice.cpp
src/qml/debugger/qqmlprofilerservice_p.h
src/qml/qml/qqmlbinding.cpp
src/qml/qml/v4/qv4bindings.cpp
src/qml/qml/v8/qv8bindings.cpp
tools/qmlprofiler/qmlprofilerapplication.cpp
tools/qmlprofiler/qmlprofilerclient.cpp
tools/qmlprofiler/qmlprofilerclient.h
tools/qmlprofiler/qmlprofilerdata.cpp
tools/qmlprofiler/qmlprofilerdata.h

index 3600586..69a4784 100644 (file)
@@ -66,6 +66,9 @@ QByteArray QQmlProfilerData::toByteArray() const
     //### using QDataStream is relatively expensive
     QQmlDebugStream ds(&data, QIODevice::WriteOnly);
     ds << time << messageType << detailType;
+    if (messageType == (int)QQmlProfilerService::RangeStart &&
+            detailType == (int)QQmlProfilerService::Binding)
+        ds << bindingType;
     if (messageType == (int)QQmlProfilerService::RangeData)
         ds << detailData;
     if (messageType == (int)QQmlProfilerService::RangeLocation)
@@ -160,7 +163,8 @@ void QQmlProfilerService::sendStartedProfilingMessageImpl()
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)StartTrace, QString(), -1, -1, 0, 0};
+    QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)StartTrace,
+                           QString(), -1, -1, 0, 0, 0};
     QQmlDebugService::sendMessage(ed.toByteArray());
 }
 
@@ -169,16 +173,18 @@ void QQmlProfilerService::addEventImpl(EventType event)
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event, QString(), -1, -1, 0, 0};
+    QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)event,
+                           QString(), -1, -1, 0, 0, 0};
     processMessage(ed);
 }
 
-void QQmlProfilerService::startRange(RangeType range)
+void QQmlProfilerService::startRange(RangeType range, BindingType bindingType)
 {
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range, QString(), -1, -1, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeStart, (int)range,
+                           QString(), -1, -1, 0, 0, (int)bindingType};
     processMessage(rd);
 }
 
@@ -187,7 +193,8 @@ void QQmlProfilerService::rangeData(RangeType range, const QString &rData)
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData, -1, -1, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range,
+                           rData, -1, -1, 0, 0, 0};
     processMessage(rd);
 }
 
@@ -196,7 +203,8 @@ void QQmlProfilerService::rangeData(RangeType range, const QUrl &rData)
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range, rData.toString(), -1, -1, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeData, (int)range,
+                           rData.toString(), -1, -1, 0, 0, 0};
     processMessage(rd);
 }
 
@@ -205,7 +213,8 @@ void QQmlProfilerService::rangeLocation(RangeType range, const QString &fileName
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName, line, column, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range,
+                           fileName, line, column, 0, 0, 0};
     processMessage(rd);
 }
 
@@ -214,7 +223,8 @@ void QQmlProfilerService::rangeLocation(RangeType range, const QUrl &fileName, i
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range, fileName.toString(), line, column, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeLocation, (int)range,
+                           fileName.toString(), line, column, 0, 0, 0};
     processMessage(rd);
 }
 
@@ -223,7 +233,8 @@ void QQmlProfilerService::endRange(RangeType range)
     if (!QQmlDebugService::isDebuggingEnabled() || !m_enabled)
         return;
 
-    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range, QString(), -1, -1, 0, 0};
+    QQmlProfilerData rd = {m_timer.nsecsElapsed(), (int)RangeEnd, (int)range,
+                           QString(), -1, -1, 0, 0, 0};
     processMessage(rd);
 }
 
@@ -238,7 +249,8 @@ void QQmlProfilerService::animationFrameImpl(qint64 delta)
     if (animCount > 0 && delta > 0) {
         // trim fps to integer
         int fps = 1000 / delta;
-        QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame, QString(), -1, -1, fps, animCount};
+        QQmlProfilerData ed = {m_timer.nsecsElapsed(), (int)Event, (int)AnimationFrame,
+                               QString(), -1, -1, fps, animCount, 0};
         processMessage(ed);
     }
 }
index eeaf871..576f981 100644 (file)
@@ -80,6 +80,7 @@ struct Q_AUTOTEST_EXPORT QQmlProfilerData
     int column;         //used by RangeLocation
     int framerate;      //used by animation events
     int animationcount; //used by animation events
+    int bindingType;
 
     QByteArray toByteArray() const;
 };
@@ -125,6 +126,14 @@ public:
         MaximumRangeType
     };
 
+    enum BindingType {
+        QmlBinding,
+        V8Binding,
+        V4Binding,
+
+        MaximumBindingType
+    };
+
     static void initialize();
 
     static bool startProfiling();
@@ -149,7 +158,7 @@ private:
     void addEventImpl(EventType);
     void animationFrameImpl(qint64);
 
-    void startRange(RangeType);
+    void startRange(RangeType, BindingType bindingType = QmlBinding);
     void rangeData(RangeType, const QString &);
     void rangeData(RangeType, const QUrl &);
     void rangeLocation(RangeType, const QString &, int, int);
@@ -183,12 +192,12 @@ private:
 //
 
 struct QQmlBindingProfiler {
-    QQmlBindingProfiler(const QString &url, int line, int column)
+    QQmlBindingProfiler(const QString &url, int line, int column, QQmlProfilerService::BindingType bindingType)
     {
         QQmlProfilerService *instance = QQmlProfilerService::instance;
         enabled = instance ? instance->profilingEnabled() : false;
         if (enabled) {
-            instance->startRange(QQmlProfilerService::Binding);
+            instance->startRange(QQmlProfilerService::Binding, bindingType);
             instance->rangeLocation(QQmlProfilerService::Binding, url, line, column);
         }
     }
index 45c2273..d60a1b4 100644 (file)
@@ -196,7 +196,7 @@ void QQmlBinding::update(QQmlPropertyPrivate::WriteFlags flags)
     trace.addDetail("Column", m_columnNumber);
 
     if (!updatingFlag()) {
-        QQmlBindingProfiler prof(m_url, m_lineNumber, m_columnNumber);
+        QQmlBindingProfiler prof(m_url, m_lineNumber, m_columnNumber, QQmlProfilerService::QmlBinding);
         setUpdatingFlag(true);
 
         QQmlAbstractExpression::DeleteWatcher watcher(this);
index dbbaa23..944d4de 100644 (file)
@@ -367,7 +367,7 @@ void QV4Bindings::run(Binding *binding, QQmlPropertyPrivate::WriteFlags flags)
     trace.addDetail("Line", binding->line);
     trace.addDetail("Column", binding->column);
 
-    QQmlBindingProfiler prof(context->urlString, binding->line, binding->column);
+    QQmlBindingProfiler prof(context->urlString, binding->line, binding->column, QQmlProfilerService::V4Binding);
 
     if (binding->updating) {
         QString name;
index 7cb14fb..f4cad9a 100644 (file)
@@ -119,7 +119,7 @@ void QV8Bindings::Binding::update(QQmlPropertyPrivate::WriteFlags flags)
     trace.addDetail("Line", instruction->line);
     trace.addDetail("Column", instruction->column);
 
-    QQmlBindingProfiler prof(parent->urlString(), instruction->line, instruction->column);
+    QQmlBindingProfiler prof(parent->urlString(), instruction->line, instruction->column, QQmlProfilerService::V8Binding);
 
     if (!updatingFlag()) {
         setUpdatingFlag(true);
index 05518dd..a7b85e1 100644 (file)
@@ -104,8 +104,8 @@ QmlProfilerApplication::QmlProfilerApplication(int &argc, char **argv) :
 
     connect(&m_qmlProfilerClient, SIGNAL(enabledChanged()), this, SLOT(traceClientEnabled()));
     connect(&m_qmlProfilerClient, SIGNAL(recordingChanged(bool)), this, SLOT(recordingChanged()));
-    connect(&m_qmlProfilerClient, SIGNAL(range(QQmlProfilerService::RangeType,qint64,qint64,QStringList,QmlEventLocation)),
-            &m_profilerData, SLOT(addQmlEvent(QQmlProfilerService::RangeType,qint64,qint64,QStringList,QmlEventLocation)));
+    connect(&m_qmlProfilerClient, SIGNAL(range(QQmlProfilerService::RangeType,QQmlProfilerService::BindingType,qint64,qint64,QStringList,QmlEventLocation)),
+            &m_profilerData, SLOT(addQmlEvent(QQmlProfilerService::RangeType,QQmlProfilerService::BindingType,qint64,qint64,QStringList,QmlEventLocation)));
     connect(&m_qmlProfilerClient, SIGNAL(traceFinished(qint64)), &m_profilerData, SLOT(setTraceEndTime(qint64)));
     connect(&m_qmlProfilerClient, SIGNAL(traceStarted(qint64)), &m_profilerData, SLOT(setTraceStartTime(qint64)));
     connect(&m_qmlProfilerClient, SIGNAL(frame(qint64,int,int)), &m_profilerData, SLOT(addFrameEvent(qint64,int,int)));
index 97ed90e..103eab8 100644 (file)
@@ -118,6 +118,7 @@ public:
     QStack<qint64> rangeStartTimes[QQmlProfilerService::MaximumRangeType];
     QStack<QStringList> rangeDatas[QQmlProfilerService::MaximumRangeType];
     QStack<QmlEventLocation> rangeLocations[QQmlProfilerService::MaximumRangeType];
+    QStack<QQmlProfilerService::BindingType> bindingTypes;
     int rangeCount[QQmlProfilerService::MaximumRangeType];
     qint64 maximumTime;
 };
@@ -138,6 +139,7 @@ void QmlProfilerClient::clearData()
 {
     ::memset(d->rangeCount, 0,
              QQmlProfilerService::MaximumRangeType * sizeof(int));
+    d->bindingTypes.clear();
     ProfilerClient::clearData();
 }
 
@@ -195,6 +197,14 @@ void QmlProfilerClient::messageReceived(const QByteArray &data)
             d->rangeStartTimes[range].push(time);
             d->inProgressRanges |= (static_cast<qint64>(1) << range);
             ++d->rangeCount[range];
+
+            // read binding type
+            if (range == (int)QQmlProfilerService::Binding) {
+                int bindingType = (int)QQmlProfilerService::QmlBinding;
+                if (!stream.atEnd())
+                    stream >> bindingType;
+                d->bindingTypes.push((QQmlProfilerService::BindingType)bindingType);
+            }
         } else if (messageType == QQmlProfilerService::RangeData) {
             QString data;
             stream >> data;
@@ -232,8 +242,11 @@ void QmlProfilerClient::messageReceived(const QByteArray &data)
                             d->rangeLocations[range].pop() : QmlEventLocation();
 
                 qint64 startTime = d->rangeStartTimes[range].pop();
+                QQmlProfilerService::BindingType bindingType = QQmlProfilerService::QmlBinding;
+                if (range == (int)QQmlProfilerService::Binding)
+                    bindingType = d->bindingTypes.pop();
                 emit this->range((QQmlProfilerService::RangeType)range,
-                                 startTime, time - startTime, data, location);
+                                 bindingType, startTime, time - startTime, data, location);
                 if (d->rangeCount[range] == 0) {
                     int count = d->rangeDatas[range].count() +
                                 d->rangeStartTimes[range].count() +
index 2a8629d..2c1fa4f 100644 (file)
@@ -97,8 +97,10 @@ public slots:
 signals:
     void traceFinished( qint64 time );
     void traceStarted( qint64 time );
-    void range(QQmlProfilerService::RangeType type, qint64 startTime,
-               qint64 length, const QStringList &data,
+    void range(QQmlProfilerService::RangeType type,
+               QQmlProfilerService::BindingType bindingType,
+               qint64 startTime, qint64 length,
+               const QStringList &data,
                const QmlEventLocation &location);
     void frame(qint64 time, int frameRate, int animationCount);
 
index 38e64ff..c564079 100644 (file)
@@ -59,17 +59,19 @@ namespace Constants {
 struct QmlRangeEventData {
     QmlRangeEventData() {} // never called
     QmlRangeEventData(const QString &_displayName,
+                 const QQmlProfilerService::BindingType &_bindingType,
                  const QString &_eventHashStr,
                  const QmlEventLocation &_location,
                  const QString &_details,
                  const QQmlProfilerService::RangeType &_eventType)
         : displayName(_displayName),eventHashStr(_eventHashStr),location(_location),
-          details(_details),eventType(_eventType) {}
+          details(_details),eventType(_eventType),bindingType(_bindingType) {}
     QString displayName;
     QString eventHashStr;
     QmlEventLocation location;
     QString details;
     QQmlProfilerService::RangeType eventType;
+    QQmlProfilerService::BindingType bindingType;
 };
 
 struct QmlRangeEventStartInstance {
@@ -221,6 +223,7 @@ qint64 QmlProfilerData::traceEndTime() const
 }
 
 void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type,
+                                  QQmlProfilerService::BindingType bindingType,
                                   qint64 startTime,
                                   qint64 duration,
                                   const QStringList &data,
@@ -262,7 +265,7 @@ void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type,
     if (d->eventDescriptions.contains(eventHashStr)) {
         newEvent = d->eventDescriptions[eventHashStr];
     } else {
-        newEvent = new QmlRangeEventData(displayName, eventHashStr, location, details, type);
+        newEvent = new QmlRangeEventData(displayName, bindingType, eventHashStr, location, details, type);
         d->eventDescriptions.insert(eventHashStr, newEvent);
     }
 
@@ -283,7 +286,7 @@ void QmlProfilerData::addFrameEvent(qint64 time, int framerate, int animationcou
     if (d->eventDescriptions.contains(eventHashStr)) {
         newEvent = d->eventDescriptions[eventHashStr];
     } else {
-        newEvent = new QmlRangeEventData(displayName, eventHashStr, QmlEventLocation(), details, QQmlProfilerService::Painting);
+        newEvent = new QmlRangeEventData(displayName, QQmlProfilerService::QmlBinding, eventHashStr, QmlEventLocation(), details, QQmlProfilerService::Painting);
         d->eventDescriptions.insert(eventHashStr, newEvent);
     }
 
@@ -495,6 +498,8 @@ bool QmlProfilerData::save(const QString &filename)
             stream.writeTextElement(QStringLiteral("column"), QString::number(eventData->location.column));
         }
         stream.writeTextElement(QStringLiteral("details"), eventData->details);
+        if (eventData->eventType == QQmlProfilerService::Binding)
+            stream.writeTextElement(QStringLiteral("bindingType"), QString::number((int)eventData->bindingType));
         stream.writeEndElement();
     }
     stream.writeEndElement(); // eventData
index 66209a1..170e77d 100644 (file)
@@ -82,8 +82,10 @@ public slots:
     void clear();
     void setTraceEndTime(qint64 time);
     void setTraceStartTime(qint64 time);
-    void addQmlEvent(QQmlProfilerService::RangeType type, qint64 startTime, qint64 duration,
-                        const QStringList &data, const QmlEventLocation &location);
+    void addQmlEvent(QQmlProfilerService::RangeType type,
+                     QQmlProfilerService::BindingType bindingType,
+                     qint64 startTime, qint64 duration, const QStringList &data,
+                     const QmlEventLocation &location);
     void addV8Event(int depth, const QString &function, const QString &filename,
                     int lineNumber, double totalTime, double selfTime);
     void addFrameEvent(qint64 time, int framerate, int animationcount);