aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickvisualdatamodel.cpp
diff options
context:
space:
mode:
authorAndrew den Exter <andrew.den-exter@nokia.com>2012-06-29 11:49:33 +1000
committerQt by Nokia <qt-info@nokia.com>2012-06-30 05:31:15 +0200
commita27feb5a95aa0756bbc37de32434111752f44e4e (patch)
tree99f63ddb5cca546d6036df818d62189c8c6e3d6c /src/quick/items/qquickvisualdatamodel.cpp
parentad52fcc452b88963c7c373240af89e9f6f494019 (diff)
Fix memory leak when cancelling incubation of view items.
Don't cancel incubation of referenced object, but if incubation is cancelled remove the scriptRef held by the incubator so the data object can be released, not just when incubation has inititialized but not finalized an object. Change-Id: If2d6a4c4409dbd771d7131782023aa5e2d08eeed Reviewed-by: Martin Jones <martin.jones@nokia.com>
Diffstat (limited to 'src/quick/items/qquickvisualdatamodel.cpp')
-rw-r--r--src/quick/items/qquickvisualdatamodel.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/src/quick/items/qquickvisualdatamodel.cpp b/src/quick/items/qquickvisualdatamodel.cpp
index 6f5934e4f1..ddd8e16ecf 100644
--- a/src/quick/items/qquickvisualdatamodel.cpp
+++ b/src/quick/items/qquickvisualdatamodel.cpp
@@ -511,17 +511,19 @@ void QQuickVisualDataModel::cancel(int index)
Compositor::iterator it = d->m_compositor.find(d->m_compositorGroup, index);
QQuickVisualDataModelItem *cacheItem = it->inCache() ? d->m_cache.at(it.cacheIndex) : 0;
if (cacheItem) {
- if (cacheItem->incubationTask) {
+ if (cacheItem->incubationTask && !cacheItem->isObjectReferenced()) {
d->releaseIncubator(cacheItem->incubationTask);
cacheItem->incubationTask = 0;
- }
- if (cacheItem->object && !cacheItem->isObjectReferenced()) {
- QObject *object = cacheItem->object;
- cacheItem->destroyObject();
- if (QQuickItem *item = qmlobject_cast<QQuickItem *>(object))
- d->emitDestroyingItem(item);
- else if (QQuickPackage *package = qmlobject_cast<QQuickPackage *>(object))
- d->emitDestroyingPackage(package);
+
+ if (cacheItem->object) {
+ QObject *object = cacheItem->object;
+ cacheItem->destroyObject();
+ if (QQuickItem *item = qmlobject_cast<QQuickItem *>(object))
+ d->emitDestroyingItem(item);
+ else if (QQuickPackage *package = qmlobject_cast<QQuickPackage *>(object))
+ d->emitDestroyingPackage(package);
+ }
+
cacheItem->scriptRef -= 1;
}
if (!cacheItem->isReferenced()) {