summaryrefslogtreecommitdiff
path: root/vcl/unx
diff options
context:
space:
mode:
authorJan-Marek Glogowski <jan-marek.glogowski@extern.cib.de>2019-11-16 02:21:26 +0000
committerJan-Marek Glogowski <glogow@fbihome.de>2019-11-19 03:13:06 +0100
commite6aac0b637d583d3cfb893276f813ff5aa1ade17 (patch)
tree431e2cc0115fb9fe7c36a978d189b66d23fb3b48 /vcl/unx
parent578f97b4b2d06d3d5d5db7fd70066ba8ca665abc (diff)
tdf#128434 try garbage collect ImplFontCache fonts
Instead of changing the harfbuzz caching, for this use case it's enough to queue all per-OutputDevice fonts for garbage collection (GC), which are managed by the OutputDevices ImplFontCache. So just try to GC all the fonts in the ImplFontCache destructor. There is no point keeping these LogicalFontInstances alive, after the OutputDevice font cache is destroyed, as these fonts aren't shared and can't be accessed later. But the main problem is still some correct accounting of harfbuzz resources and eventual even the Freetype ones, so this cleanup would not really be needed. AFAI can tell, this plugs the remaining per-document leaks of the PDF generation, except for a 72 byte basic listener leak from: basic::ImplRepository::impl_createManagerForModel(...) basicmanagerrepository.cxx:480 Change-Id: I3155be59a2bdcd85e01f6f048b990db04d88c94f Reviewed-on: https://gerrit.libreoffice.org/82968 Tested-by: Jenkins Reviewed-by: Jan-Marek Glogowski <glogow@fbihome.de>
Diffstat (limited to 'vcl/unx')
-rw-r--r--vcl/unx/generic/glyphs/glyphcache.cxx21
1 files changed, 20 insertions, 1 deletions
diff --git a/vcl/unx/generic/glyphs/glyphcache.cxx b/vcl/unx/generic/glyphs/glyphcache.cxx
index 34543b7731a0..9640ea70adcf 100644
--- a/vcl/unx/generic/glyphs/glyphcache.cxx
+++ b/vcl/unx/generic/glyphs/glyphcache.cxx
@@ -199,6 +199,21 @@ void GlyphCache::UncacheFont( FreetypeFont& rFreetypeFont )
}
}
+void GlyphCache::TryGarbageCollectFont(LogicalFontInstance *pFontInstance)
+{
+ if (maFontList.empty() || !pFontInstance)
+ return;
+ FreetypeFontInstance* pFFI = dynamic_cast<FreetypeFontInstance*>(pFontInstance);
+ if (!pFFI)
+ return;
+ FreetypeFont* pFreetypeFont = pFFI->GetFreetypeFont();
+ if (pFreetypeFont && (pFreetypeFont->GetRefCount() <= 0))
+ {
+ mpCurrentGCFont = pFreetypeFont;
+ GarbageCollect();
+ }
+}
+
void GlyphCache::GarbageCollect()
{
// when current GC font has been destroyed get another one
@@ -236,7 +251,11 @@ void GlyphCache::GarbageCollect()
if( pFreetypeFont == mpCurrentGCFont )
mpCurrentGCFont = nullptr;
- maFontList.erase(pFreetypeFont->GetFontInstance());
+#ifndef NDEBUG
+ int nErased =
+#endif
+ maFontList.erase(pFreetypeFont->GetFontInstance());
+ assert(1 == nErased);
}
}