aboutsummaryrefslogtreecommitdiffstats
path: root/tools/qmlprofiler/qmlprofilerdata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/qmlprofiler/qmlprofilerdata.cpp')
-rw-r--r--tools/qmlprofiler/qmlprofilerdata.cpp166
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();