diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2013-03-15 01:28:40 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-03-20 07:02:29 +0100 |
commit | 36cb3f3f655a9090c82de609010cbfb88651a0f3 (patch) | |
tree | ec892d912da12ce9cbdf96ca3c4952909fa50cd7 /src/gui/text/qfontengine.cpp | |
parent | ef9c3c753dd22e675b334e1b045f93401e1f9df3 (diff) |
Fix the font engines leaking
1. when there were some engines with ref > 1 in the cache, prior to calling
QFontDatabase::{add,remove}ApplicationFont()/removeAllApplicationFonts()
(QFontCache::clear() has never decreased engine's cache_count);
2. when the QFontEngineData's engine is not in cache i.e. the Box or Test font engine
(~QFontEngineData() didn't free engines it keeps).
Instead of using the font engine's (external) "cache_count" counter,
QFontCache now references a given font engine every time it is inserted to
the cache and dereferences exactly that number of times in clear().
Change-Id: I87677ebd24c1f4a81a53526f2e726e596b043c61
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Diffstat (limited to 'src/gui/text/qfontengine.cpp')
-rw-r--r-- | src/gui/text/qfontengine.cpp | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index 2bf33863f7..dbe56889da 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -170,6 +170,28 @@ static void hb_freeFace(void *face) qHBFreeFace((HB_Face)face); } + +#ifdef QT_BUILD_INTERNAL +// for testing purpose only, not thread-safe! +static QList<QFontEngine *> *enginesCollector = 0; + +Q_AUTOTEST_EXPORT void QFontEngine_startCollectingEngines() +{ + delete enginesCollector; + enginesCollector = new QList<QFontEngine *>(); +} + +Q_AUTOTEST_EXPORT QList<QFontEngine *> QFontEngine_stopCollectingEngines() +{ + Q_ASSERT(enginesCollector); + QList<QFontEngine *> ret = *enginesCollector; + delete enginesCollector; + enginesCollector = 0; + return ret; +} +#endif // QT_BUILD_INTERNAL + + // QFontEngine QFontEngine::QFontEngine() @@ -177,7 +199,6 @@ QFontEngine::QFontEngine() font_(0), font_destroy_func(0), face_(0), face_destroy_func(0) { - cache_count = 0; fsType = 0; symbol = false; @@ -194,6 +215,11 @@ QFontEngine::QFontEngine() glyphFormat = -1; m_subPixelPositionCount = 0; + +#ifdef QT_BUILD_INTERNAL + if (enginesCollector) + enginesCollector->append(this); +#endif } QFontEngine::~QFontEngine() @@ -208,6 +234,11 @@ QFontEngine::~QFontEngine() face_destroy_func(face_); face_ = 0; } + +#ifdef QT_BUILD_INTERNAL + if (enginesCollector) + enginesCollector->removeOne(this); +#endif } QFixed QFontEngine::lineThickness() const @@ -1384,11 +1415,8 @@ QFontEngineMulti::~QFontEngineMulti() { for (int i = 0; i < engines.size(); ++i) { QFontEngine *fontEngine = engines.at(i); - if (fontEngine) { - fontEngine->ref.deref(); - if (fontEngine->cache_count == 0 && fontEngine->ref.load() == 0) - delete fontEngine; - } + if (fontEngine && !fontEngine->ref.deref()) + delete fontEngine; } } |