aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlmodels
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-03-25 15:52:10 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-03-27 12:29:29 +0100
commit0b2c04215dcdb0f209c46abe24c63deaaffc471c (patch)
tree5fcdf8476053ab55b30f09440190c8a228d998e0 /src/qmlmodels
parentc64013079908e0d6ce90d565fbeaed7816c236ff (diff)
QQmlTableInstanceModel: Restore draining behavior of Qt 5.14
In Qt 5.14 model items are directly deleted when draining the reusable items pool, rather than calling deleteLater() on them. This may be slightly more efficient and due to some unknown side effect the deleteLater() call creates a memory leak. Restore the direct delete in drainReusableItems(). Fixes: QTBUG-82000 Change-Id: Ia1027b1004c04e8aceaa5ff16a600849c46bf470 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/qmlmodels')
-rw-r--r--src/qmlmodels/qqmltableinstancemodel.cpp13
-rw-r--r--src/qmlmodels/qqmltableinstancemodel_p.h7
2 files changed, 15 insertions, 5 deletions
diff --git a/src/qmlmodels/qqmltableinstancemodel.cpp b/src/qmlmodels/qqmltableinstancemodel.cpp
index b0c322e633..6e21f2f389 100644
--- a/src/qmlmodels/qqmltableinstancemodel.cpp
+++ b/src/qmlmodels/qqmltableinstancemodel.cpp
@@ -232,14 +232,17 @@ QQmlInstanceModel::ReleaseFlags QQmlTableInstanceModel::release(QObject *object,
}
// The item is not reused or referenced by anyone, so just delete it
- destroyModelItem(modelItem);
+ destroyModelItem(modelItem, Deferred);
return QQmlInstanceModel::Destroyed;
}
-void QQmlTableInstanceModel::destroyModelItem(QQmlDelegateModelItem *modelItem)
+void QQmlTableInstanceModel::destroyModelItem(QQmlDelegateModelItem *modelItem, DestructionMode mode)
{
emit destroyingItem(modelItem->object);
- modelItem->destroyObject();
+ if (mode == Deferred)
+ modelItem->destroyObject();
+ else
+ delete modelItem->object;
delete modelItem;
}
@@ -284,7 +287,9 @@ void QQmlTableInstanceModel::cancel(int index)
void QQmlTableInstanceModel::drainReusableItemsPool(int maxPoolTime)
{
- m_reusableItemsPool.drain(maxPoolTime, [=](QQmlDelegateModelItem *modelItem){ destroyModelItem(modelItem); });
+ m_reusableItemsPool.drain(maxPoolTime, [this](QQmlDelegateModelItem *modelItem) {
+ destroyModelItem(modelItem, Immediate);
+ });
}
void QQmlTableInstanceModel::reuseItem(QQmlDelegateModelItem *item, int newModelIndex)
diff --git a/src/qmlmodels/qqmltableinstancemodel_p.h b/src/qmlmodels/qqmltableinstancemodel_p.h
index 95d945f979..0d96d35a5e 100644
--- a/src/qmlmodels/qqmltableinstancemodel_p.h
+++ b/src/qmlmodels/qqmltableinstancemodel_p.h
@@ -124,6 +124,11 @@ public:
int indexOf(QObject *, QObject *) const override { Q_UNREACHABLE(); return 0; }
private:
+ enum DestructionMode {
+ Deferred,
+ Immediate
+ };
+
QQmlComponent *resolveDelegate(int index);
QQmlAdaptorModel m_adaptorModel;
@@ -141,7 +146,7 @@ private:
void deleteIncubationTaskLater(QQmlIncubator *incubationTask);
void deleteAllFinishedIncubationTasks();
QQmlDelegateModelItem *resolveModelItem(int index);
- void destroyModelItem(QQmlDelegateModelItem *modelItem);
+ void destroyModelItem(QQmlDelegateModelItem *modelItem, DestructionMode mode);
void dataChangedCallback(const QModelIndex &begin, const QModelIndex &end, const QVector<int> &roles);