From: Christiaan Janssen Date: Wed, 2 May 2012 15:32:57 +0000 (+0200) Subject: QmlProfiler: storing binding type X-Git-Tag: upstream/5.2.1~1952 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3b66a38e58fe030b6d2c4cd12c9884af660652a9;p=platform%2Fupstream%2Fqtdeclarative.git QmlProfiler: storing binding type Change-Id: If1f02e1e6f6ce6aba9874a63d01a08d57571f991 Reviewed-by: Kai Koehne --- diff --git a/src/qml/debugger/qqmlprofilerservice.cpp b/src/qml/debugger/qqmlprofilerservice.cpp index 3600586..69a4784 100644 --- a/src/qml/debugger/qqmlprofilerservice.cpp +++ b/src/qml/debugger/qqmlprofilerservice.cpp @@ -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); } } diff --git a/src/qml/debugger/qqmlprofilerservice_p.h b/src/qml/debugger/qqmlprofilerservice_p.h index eeaf871..576f981 100644 --- a/src/qml/debugger/qqmlprofilerservice_p.h +++ b/src/qml/debugger/qqmlprofilerservice_p.h @@ -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); } } diff --git a/src/qml/qml/qqmlbinding.cpp b/src/qml/qml/qqmlbinding.cpp index 45c2273..d60a1b4 100644 --- a/src/qml/qml/qqmlbinding.cpp +++ b/src/qml/qml/qqmlbinding.cpp @@ -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); diff --git a/src/qml/qml/v4/qv4bindings.cpp b/src/qml/qml/v4/qv4bindings.cpp index dbbaa23..944d4de 100644 --- a/src/qml/qml/v4/qv4bindings.cpp +++ b/src/qml/qml/v4/qv4bindings.cpp @@ -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; diff --git a/src/qml/qml/v8/qv8bindings.cpp b/src/qml/qml/v8/qv8bindings.cpp index 7cb14fb..f4cad9a 100644 --- a/src/qml/qml/v8/qv8bindings.cpp +++ b/src/qml/qml/v8/qv8bindings.cpp @@ -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); diff --git a/tools/qmlprofiler/qmlprofilerapplication.cpp b/tools/qmlprofiler/qmlprofilerapplication.cpp index 05518dd..a7b85e1 100644 --- a/tools/qmlprofiler/qmlprofilerapplication.cpp +++ b/tools/qmlprofiler/qmlprofilerapplication.cpp @@ -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))); diff --git a/tools/qmlprofiler/qmlprofilerclient.cpp b/tools/qmlprofiler/qmlprofilerclient.cpp index 97ed90e..103eab8 100644 --- a/tools/qmlprofiler/qmlprofilerclient.cpp +++ b/tools/qmlprofiler/qmlprofilerclient.cpp @@ -118,6 +118,7 @@ public: QStack rangeStartTimes[QQmlProfilerService::MaximumRangeType]; QStack rangeDatas[QQmlProfilerService::MaximumRangeType]; QStack rangeLocations[QQmlProfilerService::MaximumRangeType]; + QStack 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(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() + diff --git a/tools/qmlprofiler/qmlprofilerclient.h b/tools/qmlprofiler/qmlprofilerclient.h index 2a8629d..2c1fa4f 100644 --- a/tools/qmlprofiler/qmlprofilerclient.h +++ b/tools/qmlprofiler/qmlprofilerclient.h @@ -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); diff --git a/tools/qmlprofiler/qmlprofilerdata.cpp b/tools/qmlprofiler/qmlprofilerdata.cpp index 38e64ff..c564079 100644 --- a/tools/qmlprofiler/qmlprofilerdata.cpp +++ b/tools/qmlprofiler/qmlprofilerdata.cpp @@ -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 diff --git a/tools/qmlprofiler/qmlprofilerdata.h b/tools/qmlprofiler/qmlprofilerdata.h index 66209a1..170e77d 100644 --- a/tools/qmlprofiler/qmlprofilerdata.h +++ b/tools/qmlprofiler/qmlprofilerdata.h @@ -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);