QFontCache: Make clear() really clear/free cached data it maintains

QFontCache::clear() now frees everything it keeps and resets the cache costs.

Change-Id: I23ac2cab5c7c7d70db03f048b6fde151a18f92e1
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Reviewed-by: jian liang <jianliang79@gmail.com>
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
This commit is contained in:
Konstantin Ritt 2013-04-12 15:23:22 +03:00 committed by The Qt Project
parent be08ef6131
commit 4f400eeec1

View File

@ -2639,18 +2639,6 @@ QFontCache::QFontCache()
QFontCache::~QFontCache() QFontCache::~QFontCache()
{ {
clear(); clear();
{
EngineDataCache::ConstIterator it = engineDataCache.constBegin(),
end = engineDataCache.constEnd();
while (it != end) {
if (!it.value()->ref.deref())
delete it.value();
else
FC_DEBUG("QFontCache::~QFontCache: engineData %p still has refcount %d",
it.value(), it.value()->ref.load());
++it;
}
}
} }
void QFontCache::clear() void QFontCache::clear()
@ -2669,29 +2657,47 @@ void QFontCache::clear()
data->engines[i] = 0; data->engines[i] = 0;
} }
} }
if (!data->ref.deref()) {
delete data;
} else {
FC_DEBUG("QFontCache::clear: engineData %p still has refcount %d",
data, data->ref.load());
}
++it; ++it;
} }
} }
bool mightHaveEnginesLeftForCleanup = true; engineDataCache.clear();
while (mightHaveEnginesLeftForCleanup) {
bool mightHaveEnginesLeftForCleanup;
do {
mightHaveEnginesLeftForCleanup = false; mightHaveEnginesLeftForCleanup = false;
for (EngineCache::Iterator it = engineCache.begin(), end = engineCache.end(); for (EngineCache::Iterator it = engineCache.begin(), end = engineCache.end();
it != end; ++it) { it != end; ++it) {
if (it.value().data && engineCacheCount.value(it.value().data) > 0) { QFontEngine *engine = it.value().data;
--engineCacheCount[it.value().data]; if (engine) {
if (!it.value().data->ref.deref()) { const int cacheCount = --engineCacheCount[engine];
Q_ASSERT(engineCacheCount.value(it.value().data) == 0); Q_ASSERT(cacheCount >= 0);
delete it.value().data; if (!engine->ref.deref()) {
mightHaveEnginesLeftForCleanup = true; Q_ASSERT(cacheCount == 0);
mightHaveEnginesLeftForCleanup = engine->type() == QFontEngine::Multi;
delete engine;
} else if (cacheCount == 0) {
FC_DEBUG("QFontCache::clear: engine %p still has refcount %d",
engine, engine->ref.load());
} }
it.value().data = 0; it.value().data = 0;
} }
} }
} } while (mightHaveEnginesLeftForCleanup);
engineCache.clear(); engineCache.clear();
engineCacheCount.clear(); engineCacheCount.clear();
total_cost = 0;
max_cost = min_cost;
} }