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
(cherry picked from commit 2ac19881f9
)
Change-Id: If254d5bca1f41ec948ec1438df0d37bf8d531bdf
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
parent
6202ea699f
commit
210617de78
|
@ -1950,7 +1950,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);
|
||||
}
|
||||
|
|
|
@ -81,10 +81,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) {
|
||||
|
|
Loading…
Reference in New Issue