aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2017-09-08 17:35:28 +0200
committerUlf Hermann <ulf.hermann@qt.io>2017-09-12 14:25:01 +0000
commit9cdb0ec22ec47dac7a0e440bd93ab7d3d0cb6a9f (patch)
tree9c2ef510e11f9be163ea48455bcc6a4fc8b8d4d3 /src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
parent8fa07c81f69f534366a2b357c5e3d7b978ecb7e8 (diff)
QmlProfiler: Don't trust in externally provided timestamps
We might get timestamps that are outside the trace time, negative timestamps, ranges that go backwards, and other insane things. In order to deal with this, we clamp all negative timestamps to 0, and treat the specified trace time as minimum range, that can be overridden by events. Change-Id: Iba661f2a4346077871fc62a46759e169b2aad49d Reviewed-by: Milian Wolff <milian.wolff@kdab.com>
Diffstat (limited to 'src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp')
-rw-r--r--src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
index 2b476e1b2f..7c85817841 100644
--- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
@@ -92,18 +92,23 @@ bool QmlProfilerTraceTime::isRestrictedToRange() const
void QmlProfilerTraceTime::clear()
{
restrictToRange(-1, -1);
- setTime(-1, -1);
+ m_startTime = -1;
+ m_endTime = -1;
}
-void QmlProfilerTraceTime::setTime(qint64 startTime, qint64 endTime)
+void QmlProfilerTraceTime::update(qint64 time)
{
- QTC_ASSERT(startTime <= endTime, endTime = startTime);
- m_startTime = startTime;
- m_endTime = endTime;
+ QTC_ASSERT(time >= 0, return);
+ if (m_startTime > time || m_startTime == -1)
+ m_startTime = time;
+ if (m_endTime < time || m_endTime == -1)
+ m_endTime = time;
+ QTC_ASSERT(m_endTime >= m_startTime, m_startTime = m_endTime);
}
void QmlProfilerTraceTime::decreaseStartTime(qint64 time)
{
+ QTC_ASSERT(time >= 0, return);
if (m_startTime > time || m_startTime == -1) {
m_startTime = time;
if (m_endTime == -1)
@@ -115,6 +120,7 @@ void QmlProfilerTraceTime::decreaseStartTime(qint64 time)
void QmlProfilerTraceTime::increaseEndTime(qint64 time)
{
+ QTC_ASSERT(time >= 0, return);
if (m_endTime < time || m_endTime == -1) {
m_endTime = time;
if (m_startTime == -1)
@@ -244,6 +250,7 @@ void QmlProfilerModelManager::addEvents(const QVector<QmlEvent> &events)
{
for (const QmlEvent &event : events) {
d->eventStream << event;
+ d->traceTime->update(event.timestamp());
d->dispatch(event, d->eventTypes[event.typeIndex()]);
}
}
@@ -251,6 +258,7 @@ void QmlProfilerModelManager::addEvents(const QVector<QmlEvent> &events)
void QmlProfilerModelManager::addEvent(const QmlEvent &event)
{
d->eventStream << event;
+ d->traceTime->update(event.timestamp());
QTC_ASSERT(event.typeIndex() < d->eventTypes.size(),
d->eventTypes.resize(event.typeIndex() + 1));
d->dispatch(event, d->eventTypes.at(event.typeIndex()));
@@ -606,7 +614,10 @@ void QmlProfilerModelManager::load(const QString &filename)
this, &QmlProfilerModelManager::addEvents);
connect(reader, &QmlProfilerFileReader::success, this, [this, reader]() {
- d->traceTime->setTime(reader->traceStart(), reader->traceEnd());
+ if (reader->traceStart() >= 0)
+ d->traceTime->decreaseStartTime(reader->traceStart());
+ if (reader->traceEnd() >= 0)
+ d->traceTime->increaseEndTime(reader->traceEnd());
setRecordedFeatures(reader->loadedFeatures());
delete reader;
acquiringDone();