diff options
Diffstat (limited to 'tools/qmlprofiler/qmlprofilerdata.cpp')
-rw-r--r-- | tools/qmlprofiler/qmlprofilerdata.cpp | 166 |
1 files changed, 109 insertions, 57 deletions
diff --git a/tools/qmlprofiler/qmlprofilerdata.cpp b/tools/qmlprofiler/qmlprofilerdata.cpp index 76d06cf564..307b9d3686 100644 --- a/tools/qmlprofiler/qmlprofilerdata.cpp +++ b/tools/qmlprofiler/qmlprofilerdata.cpp @@ -74,16 +74,16 @@ struct QmlRangeEventData { QmlRangeEventData() {} // never called QmlRangeEventData(const QString &_displayName, int _detailType, const QString &_eventHashStr, const QmlEventLocation &_location, const QString &_details, - QQmlProfilerService::Message _message, - QQmlProfilerService::RangeType _rangeType) + QQmlProfilerDefinitions::Message _message, + QQmlProfilerDefinitions::RangeType _rangeType) : displayName(_displayName), eventHashStr(_eventHashStr), location(_location), details(_details), message(_message), rangeType(_rangeType), detailType(_detailType) {} QString displayName; QString eventHashStr; QmlEventLocation location; QString details; - QQmlProfilerService::Message message; - QQmlProfilerService::RangeType rangeType; + QQmlProfilerDefinitions::Message message; + QQmlProfilerDefinitions::RangeType rangeType; int detailType; // can be BindingType, PixmapCacheEventType or SceneGraphFrameType }; @@ -179,18 +179,18 @@ QmlProfilerData::~QmlProfilerData() void QmlProfilerData::clear() { - qDeleteAll(d->eventDescriptions.values()); + qDeleteAll(d->eventDescriptions); d->eventDescriptions.clear(); d->startInstanceList.clear(); - qDeleteAll(d->v8EventHash.values()); + qDeleteAll(d->v8EventHash); d->v8EventHash.clear(); d->v8parents.clear(); d->clearV8RootEvent(); d->v8MeasuredTime = 0; - d->traceEndTime = 0; - d->traceStartTime = -1; + d->traceEndTime = std::numeric_limits<qint64>::min(); + d->traceStartTime = std::numeric_limits<qint64>::max(); d->qmlMeasuredTime = 0; setState(Empty); @@ -210,7 +210,7 @@ QString QmlProfilerData::getHashStringForV8Event(const QString &displayName, con return QString(QStringLiteral("%1:%2")).arg(displayName, function); } -QString QmlProfilerData::qmlRangeTypeAsString(QQmlProfilerService::RangeType type) +QString QmlProfilerData::qmlRangeTypeAsString(QQmlProfilerDefinitions::RangeType type) { if (type * sizeof(QString) < sizeof(RANGE_TYPE_STRINGS)) return QLatin1String(RANGE_TYPE_STRINGS[type]); @@ -218,7 +218,7 @@ QString QmlProfilerData::qmlRangeTypeAsString(QQmlProfilerService::RangeType typ return QString::number(type); } -QString QmlProfilerData::qmlMessageAsString(QQmlProfilerService::Message type) +QString QmlProfilerData::qmlMessageAsString(QQmlProfilerDefinitions::Message type) { if (type * sizeof(QString) < sizeof(MESSAGE_STRINGS)) return QLatin1String(MESSAGE_STRINGS[type]); @@ -228,12 +228,14 @@ QString QmlProfilerData::qmlMessageAsString(QQmlProfilerService::Message type) void QmlProfilerData::setTraceStartTime(qint64 time) { - d->traceStartTime = time; + if (time < d->traceStartTime) + d->traceStartTime = time; } void QmlProfilerData::setTraceEndTime(qint64 time) { - d->traceEndTime = time; + if (time > d->traceEndTime) + d->traceEndTime = time; } qint64 QmlProfilerData::traceStartTime() const @@ -246,8 +248,8 @@ qint64 QmlProfilerData::traceEndTime() const return d->traceEndTime; } -void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type, - QQmlProfilerService::BindingType bindingType, +void QmlProfilerData::addQmlEvent(QQmlProfilerDefinitions::RangeType type, + QQmlProfilerDefinitions::BindingType bindingType, qint64 startTime, qint64 duration, const QStringList &data, @@ -260,8 +262,8 @@ void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type, if (data.isEmpty()) details = tr("Source code not available"); else { - details = data.join(QStringLiteral(" ")).replace( - QLatin1Char('\n'),QStringLiteral(" ")).simplified(); + details = data.join(QLatin1Char(' ')).replace( + QLatin1Char('\n'), QLatin1Char(' ')).simplified(); QRegExp rewrite(QStringLiteral("\\(function \\$(\\w+)\\(\\) \\{ (return |)(.+) \\}\\)")); bool match = rewrite.exactMatch(details); if (match) { @@ -290,7 +292,7 @@ void QmlProfilerData::addQmlEvent(QQmlProfilerService::RangeType type, newEvent = d->eventDescriptions[eventHashStr]; } else { newEvent = new QmlRangeEventData(displayName, bindingType, eventHashStr, location, details, - QQmlProfilerService::MaximumMessage, type); + QQmlProfilerDefinitions::MaximumMessage, type); d->eventDescriptions.insert(eventHashStr, newEvent); } @@ -311,11 +313,11 @@ void QmlProfilerData::addFrameEvent(qint64 time, int framerate, int animationcou if (d->eventDescriptions.contains(eventHashStr)) { newEvent = d->eventDescriptions[eventHashStr]; } else { - newEvent = new QmlRangeEventData(displayName, QQmlProfilerService::AnimationFrame, + newEvent = new QmlRangeEventData(displayName, QQmlProfilerDefinitions::AnimationFrame, eventHashStr, QmlEventLocation(), details, - QQmlProfilerService::Event, - QQmlProfilerService::MaximumRangeType); + QQmlProfilerDefinitions::Event, + QQmlProfilerDefinitions::MaximumRangeType); d->eventDescriptions.insert(eventHashStr, newEvent); } @@ -325,7 +327,10 @@ void QmlProfilerData::addFrameEvent(qint64 time, int framerate, int animationcou d->startInstanceList.append(rangeEventStartInstance); } -void QmlProfilerData::addSceneGraphFrameEvent(QQmlProfilerDefinitions::SceneGraphFrameType type, qint64 time, qint64 numericData1, qint64 numericData2, qint64 numericData3, qint64 numericData4, qint64 numericData5) +void QmlProfilerData::addSceneGraphFrameEvent(QQmlProfilerDefinitions::SceneGraphFrameType type, + qint64 time, qint64 numericData1, qint64 numericData2, + qint64 numericData3, qint64 numericData4, + qint64 numericData5) { setState(AcquiringData); @@ -336,8 +341,8 @@ void QmlProfilerData::addSceneGraphFrameEvent(QQmlProfilerDefinitions::SceneGrap } else { newEvent = new QmlRangeEventData(QStringLiteral("<SceneGraph>"), type, eventHashStr, QmlEventLocation(), QString(), - QQmlProfilerService::SceneGraphFrame, - QQmlProfilerService::MaximumRangeType); + QQmlProfilerDefinitions::SceneGraphFrame, + QQmlProfilerDefinitions::MaximumRangeType); d->eventDescriptions.insert(eventHashStr, newEvent); } @@ -362,8 +367,8 @@ void QmlProfilerData::addPixmapCacheEvent(QQmlProfilerDefinitions::PixmapEventTy newEvent = d->eventDescriptions[eventHashStr]; } else { newEvent = new QmlRangeEventData(eventHashStr, type, eventHashStr, location, QString(), - QQmlProfilerService::PixmapCacheEvent, - QQmlProfilerService::MaximumRangeType); + QQmlProfilerDefinitions::PixmapCacheEvent, + QQmlProfilerDefinitions::MaximumRangeType); d->eventDescriptions.insert(eventHashStr, newEvent); } @@ -372,7 +377,7 @@ void QmlProfilerData::addPixmapCacheEvent(QQmlProfilerDefinitions::PixmapEventTy d->startInstanceList.append(rangeEventStartInstance); } -void QmlProfilerData::addMemoryEvent(QQmlProfilerService::MemoryType type, qint64 time, +void QmlProfilerData::addMemoryEvent(QQmlProfilerDefinitions::MemoryType type, qint64 time, qint64 size) { setState(AcquiringData); @@ -382,14 +387,33 @@ void QmlProfilerData::addMemoryEvent(QQmlProfilerService::MemoryType type, qint6 newEvent = d->eventDescriptions[eventHashStr]; } else { newEvent = new QmlRangeEventData(eventHashStr, type, eventHashStr, QmlEventLocation(), - QString(), QQmlProfilerService::MemoryAllocation, - QQmlProfilerService::MaximumRangeType); + QString(), QQmlProfilerDefinitions::MemoryAllocation, + QQmlProfilerDefinitions::MaximumRangeType); d->eventDescriptions.insert(eventHashStr, newEvent); } QmlRangeEventStartInstance rangeEventStartInstance(time, size, 0, 0, 0, 0, newEvent); d->startInstanceList.append(rangeEventStartInstance); } +void QmlProfilerData::addInputEvent(QQmlProfilerDefinitions::EventType type, qint64 time) +{ + setState(AcquiringData); + + QString eventHashStr = QString::fromLatin1("Input:%1").arg(type); + + QmlRangeEventData *newEvent; + if (d->eventDescriptions.contains(eventHashStr)) { + newEvent = d->eventDescriptions[eventHashStr]; + } else { + newEvent = new QmlRangeEventData(QString(), type, eventHashStr, QmlEventLocation(), + QString(), QQmlProfilerDefinitions::Event, + QQmlProfilerDefinitions::MaximumRangeType); + d->eventDescriptions.insert(eventHashStr, newEvent); + } + + d->startInstanceList.append(QmlRangeEventStartInstance(time, -1, 0, 0, 0, newEvent)); +} + QString QmlProfilerData::rootEventName() { return tr("<program>"); @@ -470,7 +494,7 @@ void QmlProfilerData::computeQmlTime() for (int i = 0; i < d->startInstanceList.count(); i++) { qint64 st = d->startInstanceList[i].startTime; - if (d->startInstanceList[i].data->rangeType == QQmlProfilerService::Painting) { + if (d->startInstanceList[i].data->rangeType == QQmlProfilerDefinitions::Painting) { continue; } @@ -553,10 +577,18 @@ bool QmlProfilerData::save(const QString &filename) return false; } - QFile file(filename); - if (!file.open(QIODevice::WriteOnly)) { - emit error(tr("Could not open %1 for writing").arg(filename)); - return false; + QFile file; + if (!filename.isEmpty()) { + file.setFileName(filename); + if (!file.open(QIODevice::WriteOnly)) { + emit error(tr("Could not open %1 for writing").arg(filename)); + return false; + } + } else { + if (!file.open(stdout, QIODevice::WriteOnly)) { + emit error(tr("Could not open stdout for writing")); + return false; + } } QXmlStreamWriter stream(&file); @@ -574,9 +606,10 @@ bool QmlProfilerData::save(const QString &filename) foreach (const QmlRangeEventData *eventData, d->eventDescriptions.values()) { stream.writeStartElement(QStringLiteral("event")); - stream.writeAttribute(QStringLiteral("index"), QString::number(d->eventDescriptions.keys().indexOf(eventData->eventHashStr))); + stream.writeAttribute(QStringLiteral("index"), QString::number( + d->eventDescriptions.keys().indexOf(eventData->eventHashStr))); stream.writeTextElement(QStringLiteral("displayname"), eventData->displayName); - if (eventData->rangeType != QQmlProfilerService::MaximumRangeType) + if (eventData->rangeType != QQmlProfilerDefinitions::MaximumRangeType) stream.writeTextElement(QStringLiteral("type"), qmlRangeTypeAsString(eventData->rangeType)); else @@ -584,24 +617,37 @@ bool QmlProfilerData::save(const QString &filename) qmlMessageAsString(eventData->message)); if (!eventData->location.filename.isEmpty()) { stream.writeTextElement(QStringLiteral("filename"), eventData->location.filename); - stream.writeTextElement(QStringLiteral("line"), QString::number(eventData->location.line)); - stream.writeTextElement(QStringLiteral("column"), QString::number(eventData->location.column)); + stream.writeTextElement(QStringLiteral("line"), + QString::number(eventData->location.line)); + stream.writeTextElement(QStringLiteral("column"), + QString::number(eventData->location.column)); } stream.writeTextElement(QStringLiteral("details"), eventData->details); - if (eventData->rangeType == QQmlProfilerService::Binding) + if (eventData->rangeType == QQmlProfilerDefinitions::Binding) stream.writeTextElement(QStringLiteral("bindingType"), QString::number((int)eventData->detailType)); - else if (eventData->message == QQmlProfilerService::Event && - eventData->detailType == QQmlProfilerService::AnimationFrame) - stream.writeTextElement(QStringLiteral("animationFrame"), - QString::number((int)eventData->detailType)); - else if (eventData->message == QQmlProfilerService::PixmapCacheEvent) + else if (eventData->message == QQmlProfilerDefinitions::Event) { + switch (eventData->detailType) { + case QQmlProfilerDefinitions::AnimationFrame: + stream.writeTextElement(QStringLiteral("animationFrame"), + QString::number((int)eventData->detailType)); + break; + case QQmlProfilerDefinitions::Key: + stream.writeTextElement(QStringLiteral("keyEvent"), + QString::number((int)eventData->detailType)); + break; + case QQmlProfilerDefinitions::Mouse: + stream.writeTextElement(QStringLiteral("mouseEvent"), + QString::number((int)eventData->detailType)); + break; + } + } else if (eventData->message == QQmlProfilerDefinitions::PixmapCacheEvent) stream.writeTextElement(QStringLiteral("cacheEventType"), QString::number((int)eventData->detailType)); - else if (eventData->message == QQmlProfilerService::SceneGraphFrame) + else if (eventData->message == QQmlProfilerDefinitions::SceneGraphFrame) stream.writeTextElement(QStringLiteral("sgEventType"), QString::number((int)eventData->detailType)); - else if (eventData->message == QQmlProfilerService::MemoryAllocation) + else if (eventData->message == QQmlProfilerDefinitions::MemoryAllocation) stream.writeTextElement(QStringLiteral("memoryEventType"), QString::number((int)eventData->detailType)); stream.writeEndElement(); @@ -615,26 +661,30 @@ bool QmlProfilerData::save(const QString &filename) if (event.duration >= 0) stream.writeAttribute(QStringLiteral("duration"), QString::number(event.duration)); - stream.writeAttribute(QStringLiteral("eventIndex"), QString::number(d->eventDescriptions.keys().indexOf(event.data->eventHashStr))); - if (event.data->message == QQmlProfilerService::Event && - event.data->detailType == QQmlProfilerService::AnimationFrame) { + stream.writeAttribute(QStringLiteral("eventIndex"), QString::number( + d->eventDescriptions.keys().indexOf(event.data->eventHashStr))); + if (event.data->message == QQmlProfilerDefinitions::Event && + event.data->detailType == QQmlProfilerDefinitions::AnimationFrame) { // special: animation frame stream.writeAttribute(QStringLiteral("framerate"), QString::number(event.frameRate)); - stream.writeAttribute(QStringLiteral("animationcount"), QString::number(event.animationCount)); + stream.writeAttribute(QStringLiteral("animationcount"), + QString::number(event.animationCount)); stream.writeAttribute(QStringLiteral("thread"), QString::number(event.threadId)); - } else if (event.data->message == QQmlProfilerService::PixmapCacheEvent) { + } else if (event.data->message == QQmlProfilerDefinitions::PixmapCacheEvent) { // special: pixmap cache event - if (event.data->detailType == QQmlProfilerService::PixmapSizeKnown) { + if (event.data->detailType == QQmlProfilerDefinitions::PixmapSizeKnown) { stream.writeAttribute(QStringLiteral("width"), QString::number(event.numericData1)); stream.writeAttribute(QStringLiteral("height"), QString::number(event.numericData2)); - } else if (event.data->detailType == QQmlProfilerService::PixmapReferenceCountChanged || - event.data->detailType == QQmlProfilerService::PixmapCacheCountChanged) { + } else if (event.data->detailType == + QQmlProfilerDefinitions::PixmapReferenceCountChanged || + event.data->detailType == + QQmlProfilerDefinitions::PixmapCacheCountChanged) { stream.writeAttribute(QStringLiteral("refCount"), QString::number(event.numericData3)); } - } else if (event.data->message == QQmlProfilerService::SceneGraphFrame) { + } else if (event.data->message == QQmlProfilerDefinitions::SceneGraphFrame) { // special: scenegraph frame events if (event.numericData1 > 0) stream.writeAttribute(QStringLiteral("timing1"), @@ -651,7 +701,7 @@ bool QmlProfilerData::save(const QString &filename) if (event.numericData5 > 0) stream.writeAttribute(QStringLiteral("timing5"), QString::number(event.numericData5)); - } else if (event.data->message == QQmlProfilerService::MemoryAllocation) { + } else if (event.data->message == QQmlProfilerDefinitions::MemoryAllocation) { stream.writeAttribute(QStringLiteral("amount"), QString::number(event.numericData1)); } stream.writeEndElement(); @@ -662,7 +712,8 @@ bool QmlProfilerData::save(const QString &filename) stream.writeAttribute(QStringLiteral("totalTime"), QString::number(d->v8MeasuredTime)); foreach (QV8EventInfo *v8event, d->v8EventHash.values()) { stream.writeStartElement(QStringLiteral("event")); - stream.writeAttribute(QStringLiteral("index"), QString::number(d->v8EventHash.keys().indexOf(v8event->eventHashStr))); + stream.writeAttribute(QStringLiteral("index"),QString::number( + d->v8EventHash.keys().indexOf(v8event->eventHashStr))); stream.writeTextElement(QStringLiteral("displayname"), v8event->displayName); stream.writeTextElement(QStringLiteral("functionname"), v8event->functionName); if (!v8event->fileName.isEmpty()) { @@ -681,7 +732,8 @@ bool QmlProfilerData::save(const QString &filename) } stream.writeAttribute(QStringLiteral("list"), childrenIndexes.join(QString(", "))); - stream.writeAttribute(QStringLiteral("childrenTimes"), childrenTimes.join(QString(", "))); + stream.writeAttribute(QStringLiteral("childrenTimes"), + childrenTimes.join(QString(", "))); stream.writeEndElement(); } stream.writeEndElement(); |