summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2023-03-29 11:43:14 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2023-03-29 11:35:24 +0000
commita2e78d06df22e99f2dc82ee3245ddc4c5de56acf (patch)
treeeb4b9befec3e327718d29b233a6453aa9a2aeb34 /vcl
parent167b864fb1933d069293760e50e1f204a3d2e63d (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.cxx4
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)