From 1ba5bae490f7e14e475e0b80f03e5f444cdce908 Mon Sep 17 00:00:00 2001 From: Michael Stahl Date: Thu, 13 Apr 2017 17:28:46 +0200 Subject: tdf#106933 vcl: delete D2DWriteTextOutRenderer before exit() As it happens this DirectWrite stuff is using some thread pool internally, and that must be shutdown before exit(), as Win32 will terminate all other threads at that point, and then the thread pool wants to talk to threads that don't exist any more. https://blogs.msdn.microsoft.com/oldnewthing/20120427-00/?p=7763/ So convert this from a global variable that is deleted from DllMain() to a member of SalData, so it is deleted from DeInitVCL(). Change-Id: I51408a07c78758cf0c193ab66b9214d0c9dbd9e3 (cherry picked from commit df556aa47da22f96b3fcd356c12419d3035cba3c) Reviewed-on: https://gerrit.libreoffice.org/36534 Tested-by: Jenkins Reviewed-by: Markus Mohrhard --- vcl/win/app/salinst.cxx | 1 + vcl/win/gdi/winlayout.cxx | 26 ++++++++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) (limited to 'vcl/win') diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx index 94ae96d53608..da67ca44582f 100644 --- a/vcl/win/app/salinst.cxx +++ b/vcl/win/app/salinst.cxx @@ -39,6 +39,7 @@ #include "win/salobj.h" #include "win/saltimer.h" #include "win/salbmp.h" +#include "win/winlayout.hxx" #include "salimestatus.hxx" #include "salsys.hxx" diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx index 482cbd7a460c..22a6fb268f55 100644 --- a/vcl/win/gdi/winlayout.cxx +++ b/vcl/win/gdi/winlayout.cxx @@ -3072,20 +3072,26 @@ void D2DWriteTextOutRenderer::CleanupModules() TextOutRenderer & TextOutRenderer::get(bool bUseDWrite) { - if (bUseDWrite) - { - static std::unique_ptr _impl(D2DWriteTextOutRenderer::InitModules() - ? static_cast(new D2DWriteTextOutRenderer()) - : static_cast(new ExTextOutRenderer())); + SalData *const pSalData = GetSalData(); - return *_impl; + if (!pSalData) + { // don't call this after DeInitVCL() + fprintf(stderr, "TextOutRenderer fatal error: no SalData"); + abort(); } - else - { - static std::unique_ptr _impl(new ExTextOutRenderer()); - return *_impl; + if (!pSalData->m_pTextOutRenderer) + { + if (bUseDWrite && D2DWriteTextOutRenderer::InitModules()) + { + pSalData->m_pTextOutRenderer.reset(new D2DWriteTextOutRenderer()); + } + else + { + pSalData->m_pTextOutRenderer.reset(new ExTextOutRenderer()); + } } + return *pSalData->m_pTextOutRenderer; } -- cgit v1.2.3