diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-03-29 11:43:14 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2023-03-29 11:35:24 +0000 |
commit | a2e78d06df22e99f2dc82ee3245ddc4c5de56acf (patch) | |
tree | eb4b9befec3e327718d29b233a6453aa9a2aeb34 /vcl | |
parent | 167b864fb1933d069293760e50e1f204a3d2e63d (diff) |
fix concurrent access to fontcache
Every now and then I see a crash in fontcache code.
Add some DBG_SOLARMUTEX calls there, which spots a few issues.
(*) In writer, SwDLL needs to be under the SolarMutex during
init, and we can just move a method call to fix that.
(*) in chart2, life is more complicated. Various of the static
defaults we build want to call OutputDevice::getFontInstance.
We can't just stick a SolarMutex somewhere in the call chain,
because those maps are built on-demand, and then we end up
with ABBA deadlocks between the SolarMutex and the mutex
in the cppu::PropertySetHelper.
So I picked a spot that is init'ed early on in chart2,
and force the init of all the troublesome tables there.
Change-Id: I832978bea35fd5fa681d144b8beff1af13ef3341
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/149648
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/font/fontcache.cxx | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/vcl/source/font/fontcache.cxx b/vcl/source/font/fontcache.cxx index 9fde6e5407a0..3fcf7ee1a7a8 100644 --- a/vcl/source/font/fontcache.cxx +++ b/vcl/source/font/fontcache.cxx @@ -25,6 +25,7 @@ #include <font/PhysicalFontFace.hxx> #include <font/PhysicalFontFamily.hxx> #include <font/LogicalFontInstance.hxx> +#include <tools/debug.hxx> #include <impfontcache.hxx> using namespace vcl::font; @@ -95,6 +96,7 @@ ImplFontCache::ImplFontCache() ImplFontCache::~ImplFontCache() { + DBG_TESTSOLARMUTEX(); for (const auto & rLFI : maFontInstanceList) { rLFI.second->mpFontCache = nullptr; @@ -112,6 +114,7 @@ rtl::Reference<LogicalFontInstance> ImplFontCache::GetFontInstance( PhysicalFont rtl::Reference<LogicalFontInstance> ImplFontCache::GetFontInstance( PhysicalFontCollection const * pFontList, vcl::font::FontSelectPattern& aFontSelData ) { + DBG_TESTSOLARMUTEX(); rtl::Reference<LogicalFontInstance> pFontInstance; PhysicalFontFamily* pFontFamily = nullptr; @@ -240,6 +243,7 @@ rtl::Reference<LogicalFontInstance> ImplFontCache::GetGlyphFallbackFont( Physica void ImplFontCache::Invalidate() { + DBG_TESTSOLARMUTEX(); // #112304# make sure the font cache is really clean mpLastHitCacheEntry = nullptr; for (auto const & pair : maFontInstanceList) |