QmlProfiler: Properly handle very large ranges when restricting

Previously, a range starting before the restriction and ending after
it would not be recognized as belonging to the restricted range.

Change-Id: I4d387f8964362635cc2bc89a6a082a4a5bfeddcb
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Ulf Hermann
2016-07-06 13:18:17 +02:00
parent d2c9466d79
commit 0d698d6b70

View File

@@ -205,6 +205,7 @@ void QmlProfilerDataModel::replayEvents(qint64 rangeStart, qint64 rangeEnd,
QFile file(d->file.fileName()); QFile file(d->file.fileName());
file.open(QIODevice::ReadOnly); file.open(QIODevice::ReadOnly);
QDataStream stream(&file); QDataStream stream(&file);
bool crossedRangeStart = false;
while (!stream.atEnd()) { while (!stream.atEnd()) {
stream >> event; stream >> event;
if (stream.status() == QDataStream::ReadPastEnd) if (stream.status() == QDataStream::ReadPastEnd)
@@ -212,7 +213,8 @@ void QmlProfilerDataModel::replayEvents(qint64 rangeStart, qint64 rangeEnd,
const QmlEventType &type = d->eventTypes[event.typeIndex()]; const QmlEventType &type = d->eventTypes[event.typeIndex()];
if (rangeStart != -1 && rangeEnd != -1) { if (rangeStart != -1 && rangeEnd != -1) {
if (event.timestamp() < rangeStart) { // Double-check if rangeStart has been crossed. Some versions of Qt send dirty data.
if (event.timestamp() < rangeStart && !crossedRangeStart) {
if (type.rangeType() != MaximumRangeType) { if (type.rangeType() != MaximumRangeType) {
if (event.rangeStage() == RangeStart) if (event.rangeStage() == RangeStart)
stack.push(event); stack.push(event);
@@ -224,31 +226,35 @@ void QmlProfilerDataModel::replayEvents(qint64 rangeStart, qint64 rangeEnd,
} else { } else {
continue; continue;
} }
} else if (event.timestamp() > rangeEnd) { } else {
if (type.rangeType() != MaximumRangeType) { if (!crossedRangeStart) {
if (event.rangeStage() == RangeEnd) { foreach (QmlEvent stashed, stack) {
if (stack.isEmpty()) { stashed.setTimestamp(rangeStart);
QmlEvent endEvent(event); loader(stashed, d->eventTypes[stashed.typeIndex()]);
endEvent.setTimestamp(rangeEnd);
loader(endEvent, d->eventTypes[event.typeIndex()]);
} else {
stack.pop();
}
} else if (event.rangeStage() == RangeStart) {
stack.push(event);
} }
continue; stack.clear();
} else if (isStateful(type)) { crossedRangeStart = true;
event.setTimestamp(rangeEnd);
} else {
continue;
} }
} else if (!stack.isEmpty()) { if (event.timestamp() > rangeEnd) {
foreach (QmlEvent stashed, stack) { if (type.rangeType() != MaximumRangeType) {
stashed.setTimestamp(rangeStart); if (event.rangeStage() == RangeEnd) {
loader(stashed, d->eventTypes[stashed.typeIndex()]); if (stack.isEmpty()) {
QmlEvent endEvent(event);
endEvent.setTimestamp(rangeEnd);
loader(endEvent, d->eventTypes[event.typeIndex()]);
} else {
stack.pop();
}
} else if (event.rangeStage() == RangeStart) {
stack.push(event);
}
continue;
} else if (isStateful(type)) {
event.setTimestamp(rangeEnd);
} else {
continue;
}
} }
stack.clear();
} }
} }