diff options
| author | Lisandro Damián Nicanor Pérez Meyer <perezmeyer@gmail.com> | 2016-06-16 13:42:46 (GMT) |
|---|---|---|
| committer | Lisandro Damián Nicanor Pérez Meyer <perezmeyer@gmail.com> | 2016-06-16 13:42:46 (GMT) |
| commit | 33b3f7d5728bde68efafa7bfca311bcd223b624c (patch) | |
| tree | b778b59fde6ad880fd7e87201031a99b54754be8 | |
| parent | 2e30f46aafb098955604293a8ec5dfe3391cc831 (diff) | |
Backport qml_only_release_types_if_they_arent_referenced_anymore.patch
| -rw-r--r-- | debian/changelog | 4 | ||||
| -rw-r--r-- | debian/patches/qml_only_release_types_if_they_arent_referenced_anymore.patch | 63 | ||||
| -rw-r--r-- | debian/patches/series | 3 |
3 files changed, 70 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 1a07f05..84ffd74 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,9 @@ qtdeclarative-opensource-src (5.6.1-4) UNRELEASED; urgency=medium + [ Lisandro Damián Nicanor Pérez Meyer ] + * Backport qml_only_release_types_if_they_arent_referenced_anymore.patch, + it solves a nasty crash. + -- Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org> Thu, 16 Jun 2016 10:37:45 -0300 qtdeclarative-opensource-src (5.6.1-3) unstable; urgency=medium diff --git a/debian/patches/qml_only_release_types_if_they_arent_referenced_anymore.patch b/debian/patches/qml_only_release_types_if_they_arent_referenced_anymore.patch new file mode 100644 index 0000000..fa5bd96 --- /dev/null +++ b/debian/patches/qml_only_release_types_if_they_arent_referenced_anymore.patch @@ -0,0 +1,63 @@ +From 9b1231ca3d21ade574a8a7cf3f0805a8b520bcd5 Mon Sep 17 00:00:00 2001 +From: Ulf Hermann <ulf.hermann@qt.io> +Date: Wed, 8 Jun 2016 17:32:32 +0200 +Subject: [PATCH] QML: Only release types if they aren't referenced anymore + +Just checking for references on m_compiledData is not enough. The +actual component can also be referenced. Thus it won't be deleted +on release(), but cannot be found in the type cache anymore. + +Task-number: QTBUG-53761 +Change-Id: I8567af8e75a078598e4fed31e4717134e1332278 +Reviewed-by: Mitch Curtis <mitch.curtis@qt.io> +Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> +(cherry picked from commit 2ac19881f92c94f4e9427bd9ff513210675f259e) +--- + src/qml/qml/qqmltypeloader.cpp | 3 ++- + tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp | 15 ++++++++++++--- + 2 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp +index c684c86..01200fd 100644 +--- a/src/qml/qml/qqmltypeloader.cpp ++++ b/src/qml/qml/qqmltypeloader.cpp +@@ -1961,7 +1961,8 @@ void QQmlTypeLoader::trimCache() + QList<TypeCache::Iterator> unneededTypes; + for (TypeCache::Iterator iter = m_typeCache.begin(), end = m_typeCache.end(); iter != end; ++iter) { + QQmlTypeData *typeData = iter.value(); +- if (typeData->m_compiledData && typeData->m_compiledData->count() == 1) { ++ if (typeData->m_compiledData && typeData->count() == 1 ++ && typeData->m_compiledData->count() == 1) { + // There are no live objects of this type + unneededTypes.append(iter); + } +diff --git a/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp b/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp +index 7045c7c..a1eaa05 100644 +--- a/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp ++++ b/tests/auto/qml/qqmltypeloader/tst_qqmltypeloader.cpp +@@ -86,10 +86,19 @@ void tst_QQMLTypeLoader::trimCache() + url.setQuery(QString::number(i)); + + QQmlTypeData *data = loader.getType(url); +- if (i % 5 == 0) // keep references to some of them so that they aren't trimmed +- data->compiledData()->addref(); ++ // Run an event loop to receive the callback that release()es. ++ QTRY_COMPARE(data->count(), 2); + +- data->release(); ++ // keep references to some of them so that they aren't trimmed. References to either the ++ // QQmlTypeData or its compiledData() should prevent the trimming. ++ if (i % 10 == 0) { ++ // keep ref on data, don't add ref on data->compiledData() ++ } else if (i % 5 == 0) { ++ data->compiledData()->addref(); ++ data->release(); ++ } else { ++ data->release(); ++ } + } + + for (int i = 0; i < 256; ++i) { +-- +2.1.4 + diff --git a/debian/patches/series b/debian/patches/series index 9741485..5e68a6d 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,2 +1,5 @@ +# Backported patches +qml_only_release_types_if_they_arent_referenced_anymore.patch + # Debian patches check_system_double-conversion.patch |
