Properly cleanup cancelled incubation.
authorMartin Jones <martin.jones@nokia.com>
Tue, 28 Feb 2012 02:03:46 +0000 (12:03 +1000)
committerQt by Nokia <qt-info@nokia.com>
Tue, 28 Feb 2012 09:58:06 +0000 (10:58 +0100)
Not all allocations were being destroyed.

Change-Id: I2134bb224c58b947cfb990b0af2f6eedfd36da4a
Reviewed-by: Andrew den Exter <andrew.den-exter@nokia.com>
src/quick/items/qquickvisualdatamodel.cpp

index 0bdf0cb..3aa6077 100644 (file)
@@ -461,8 +461,28 @@ 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 && cacheItem->incubationTask)
-        d->releaseIncubator(cacheItem->incubationTask);
+    if (cacheItem) {
+        if (cacheItem->incubationTask) {
+            delete cacheItem->incubationTask->incubatingContext;
+            cacheItem->incubationTask->incubatingContext = 0;
+            d->releaseIncubator(cacheItem->incubationTask);
+            cacheItem->incubationTask = 0;
+        }
+        if (cacheItem->object && !cacheItem->isObjectReferenced()) {
+            d->destroy(cacheItem->object);
+            if (QDeclarativePackage *package = qobject_cast<QDeclarativePackage *>(cacheItem->object))
+                d->emitDestroyingPackage(package);
+            else if (QQuickItem *item = qobject_cast<QQuickItem *>(cacheItem->object))
+                d->emitDestroyingItem(item);
+            cacheItem->object = 0;
+        }
+        if (!cacheItem->isReferenced()) {
+            d->m_compositor.clearFlags(Compositor::Cache, it.cacheIndex, 1, Compositor::CacheFlag);
+            d->m_cache.removeAt(it.cacheIndex);
+            delete cacheItem;
+            Q_ASSERT(d->m_cache.count() == d->m_compositor.count(Compositor::Cache));
+        }
+    }
 }
 
 void QQuickVisualDataModelPrivate::group_append(