forked from qt-creator/qt-creator
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:
@@ -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();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user