QCache: fix updating entries breaking the internal chain
After f08492c6fd was
merged this bug would manifest as an entry appearing twice
in the chain when a updating an existing entry (insert with
an existing key). This could sometimes result in crashes later
as the list filled up and the list was used in trim() to remove
various entries.
Fixes: QTBUG-89176
Pick-to: 6.0
Change-Id: Ide80160fb4317dc0aefe79eec5dce7ec6813e790
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
bb10
parent
ac210c73e4
commit
0ca4635832
|
|
@ -247,14 +247,15 @@ public:
|
|||
if (result.initialized) {
|
||||
cost -= n->value.cost;
|
||||
result.it.node()->emplace(object, cost);
|
||||
relink(key);
|
||||
} else {
|
||||
Node::createInPlace(n, key, object, cost);
|
||||
n->prev = &chain;
|
||||
n->next = chain.next;
|
||||
chain.next->prev = n;
|
||||
chain.next = n;
|
||||
}
|
||||
total += cost;
|
||||
n->prev = &chain;
|
||||
n->next = chain.next;
|
||||
chain.next->prev = n;
|
||||
chain.next = n;
|
||||
return true;
|
||||
}
|
||||
T *object(const Key &key) const noexcept
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ private slots:
|
|||
void take();
|
||||
void axioms_on_key_type();
|
||||
void largeCache();
|
||||
void internalChainOrderAfterEntryUpdate();
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -414,5 +415,21 @@ void tst_QCache::largeCache()
|
|||
QVERIFY(cache.size() == 0);
|
||||
}
|
||||
|
||||
// The internal chain could lose track of some objects.
|
||||
// Make sure it doesn't happen again.
|
||||
void tst_QCache::internalChainOrderAfterEntryUpdate()
|
||||
{
|
||||
QCache<QString, int> cache;
|
||||
cache.setMaxCost(20);
|
||||
cache.insert(QString::number(1), new int, 1);
|
||||
cache.insert(QString::number(2), new int, 1);
|
||||
cache.insert(QString::number(1), new int, 1);
|
||||
// If the chain is still 'in order' then setting maxCost == 0 should
|
||||
// a. not crash, and
|
||||
// b. remove all the elements in the QHash
|
||||
cache.setMaxCost(0);
|
||||
QCOMPARE(cache.size(), 0);
|
||||
}
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_QCache)
|
||||
#include "tst_qcache.moc"
|
||||
|
|
|
|||
Loading…
Reference in New Issue