diff options
-rw-r--r-- | plugins/qmlprofilerextension/memoryusagemodel.cpp | 73 | ||||
-rw-r--r-- | plugins/qmlprofilerextension/memoryusagemodel.h | 9 |
2 files changed, 56 insertions, 26 deletions
diff --git a/plugins/qmlprofilerextension/memoryusagemodel.cpp b/plugins/qmlprofilerextension/memoryusagemodel.cpp index 6c3282aa9f..5085b0bfbe 100644 --- a/plugins/qmlprofilerextension/memoryusagemodel.cpp +++ b/plugins/qmlprofilerextension/memoryusagemodel.cpp @@ -145,7 +145,7 @@ const QVariantList MemoryUsageModel::getEventDetails(int index) const const MemoryUsageModelPrivate::Range *ev = &d->range(index); QVariantMap res; - if (ev->delta > 0) + if (ev->allocated >= -ev->deallocated) res.insert(title, tr("Memory Allocated")); else res.insert(title, tr("Memory Freed")); @@ -156,7 +156,14 @@ const QVariantList MemoryUsageModel::getEventDetails(int index) const result << res; res.clear(); - res.insert(tr("Allocation"), QVariant(QString::fromLatin1("%1 bytes").arg(ev->delta))); + if (ev->allocations > 0) { + res.insert(tr("Allocated"), QString::fromLatin1("%1 bytes").arg(ev->allocated)); + res.insert(tr("Allocations"), QString::number(ev->allocations)); + } + if (ev->deallocations > 0) { + res.insert(tr("Deallocated"), QString::fromLatin1("%1 bytes").arg(-ev->deallocated)); + res.insert(tr("Deallocations"), QString::number(ev->deallocations)); + } res.insert(tr("Type"), QVariant(MemoryUsageModelPrivate::memoryTypeName(ev->type))); if (ev->originTypeIndex != -1) { res.insert(tr("Location"), @@ -189,9 +196,7 @@ void MemoryUsageModel::loadData() int currentJSHeapIndex = -1; QStack<RangeStackFrame> rangeStack; - MemoryAllocation dummy = { - QmlDebug::MaximumMemoryType, -1, -1 , -1 - }; + MemoryAllocation dummy; const QVector<QmlProfilerDataModel::QmlEventTypeData> &types = simpleModel->getEventTypes(); foreach (const QmlProfilerDataModel::QmlEventData &event, simpleModel->getEvents()) { @@ -207,18 +212,18 @@ void MemoryUsageModel::loadData() } if (type.detailType == QmlDebug::SmallItem || type.detailType == QmlDebug::LargeItem) { - currentUsage += event.numericData1; MemoryAllocation &last = currentUsageIndex > -1 ? d->data(currentUsageIndex) : dummy; - if (!rangeStack.empty() && last.originTypeIndex == rangeStack.top().originTypeIndex) { - last.size = currentUsage; - last.delta += event.numericData1; + if (!rangeStack.empty() && type.detailType == last.type && + last.originTypeIndex == rangeStack.top().originTypeIndex && + rangeStack.top().startTime < d->range(currentUsageIndex).start) { + last.update(event.numericData1); + currentUsage = last.size; } else { - MemoryAllocation allocation = { - QmlDebug::SmallItem, - currentUsage, - event.numericData1, - rangeStack.empty() ? -1 : rangeStack.top().originTypeIndex - }; + MemoryAllocation allocation(QmlDebug::SmallItem, currentUsage, + rangeStack.empty() ? -1 : rangeStack.top().originTypeIndex); + allocation.update(event.numericData1); + currentUsage = allocation.size; + if (currentUsageIndex != -1) { d->insertEnd(currentUsageIndex, event.startTime - d->range(currentUsageIndex).start - 1); @@ -228,18 +233,17 @@ void MemoryUsageModel::loadData() } if (type.detailType == QmlDebug::HeapPage || type.detailType == QmlDebug::LargeItem) { - currentSize += event.numericData1; MemoryAllocation &last = currentJSHeapIndex > -1 ? d->data(currentJSHeapIndex) : dummy; - if (!rangeStack.empty() && last.originTypeIndex == rangeStack.top().originTypeIndex) { - last.size = currentSize; - last.delta += event.numericData1; + if (!rangeStack.empty() && type.detailType == last.type && + last.originTypeIndex == rangeStack.top().originTypeIndex && + rangeStack.top().startTime < d->range(currentJSHeapIndex).start) { + last.update(event.numericData1); + currentSize = last.size; } else { - MemoryAllocation allocation = { - (QmlDebug::MemoryType)type.detailType, - currentSize, - event.numericData1, - rangeStack.empty() ? -1 : rangeStack.top().originTypeIndex - }; + MemoryAllocation allocation((QmlDebug::MemoryType)type.detailType, currentSize, + rangeStack.empty() ? -1 : rangeStack.top().originTypeIndex); + allocation.update(event.numericData1); + currentSize = allocation.size; if (currentSize > d->maxSize) d->maxSize = currentSize; @@ -286,6 +290,25 @@ QString MemoryUsageModel::MemoryUsageModelPrivate::memoryTypeName(int type) } } +MemoryUsageModel::MemoryAllocation::MemoryAllocation(QmlDebug::MemoryType type, qint64 baseAmount, + int originTypeIndex) : + type(type), size(baseAmount), allocated(0), deallocated(0), allocations(0), deallocations(0), + originTypeIndex(originTypeIndex) +{ +} + +void MemoryUsageModel::MemoryAllocation::update(qint64 amount) +{ + size += amount; + if (amount < 0) { + deallocated += amount; + ++deallocations; + } else { + allocated += amount; + ++allocations; + } +} + } // namespace Internal } // namespace QmlProfilerExtension diff --git a/plugins/qmlprofilerextension/memoryusagemodel.h b/plugins/qmlprofilerextension/memoryusagemodel.h index 7559c9c749..e345381250 100644 --- a/plugins/qmlprofilerextension/memoryusagemodel.h +++ b/plugins/qmlprofilerextension/memoryusagemodel.h @@ -37,8 +37,15 @@ public: struct MemoryAllocation { QmlDebug::MemoryType type; qint64 size; - qint64 delta; + qint64 allocated; + qint64 deallocated; + int allocations; + int deallocations; int originTypeIndex; + + MemoryAllocation(QmlDebug::MemoryType type = QmlDebug::MaximumMemoryType, + qint64 baseAmount = 0, int originTypeIndex = -1); + void update(qint64 amount); }; MemoryUsageModel(QObject *parent = 0); |