[Libreoffice-commits] core.git: Branch 'libreoffice-5-3' - vcl/inc vcl/win

Michael Stahl mstahl at redhat.com
Sat Apr 15 21:08:09 UTC 2017


 vcl/inc/win/saldata.hxx   |    4 ++++
 vcl/win/app/salinst.cxx   |    1 +
 vcl/win/gdi/winlayout.cxx |   26 ++++++++++++++++----------
 3 files changed, 21 insertions(+), 10 deletions(-)

New commits:
commit 1ba5bae490f7e14e475e0b80f03e5f444cdce908
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Apr 13 17:28:46 2017 +0200

    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 <ci at libreoffice.org>
    Reviewed-by: Markus Mohrhard <markus.mohrhard at googlemail.com>

diff --git a/vcl/inc/win/saldata.hxx b/vcl/inc/win/saldata.hxx
index fc82e13b617a..cf11a04ddace 100644
--- a/vcl/inc/win/saldata.hxx
+++ b/vcl/inc/win/saldata.hxx
@@ -39,6 +39,7 @@ class WinSalPrinter;
 namespace vcl { class Font; }
 struct HDCCache;
 struct TempFontItem;
+class TextOutRenderer;
 
 #define MAX_STOCKPEN            4
 #define MAX_STOCKBRUSH          4
@@ -118,6 +119,9 @@ public:
 
     std::set< HMENU >       mhMenuSet;              // keeps track of menu handles created by VCL, used by IsKnownMenuHandle()
     std::map< UINT,sal_uInt16 > maVKMap;      // map some dynamic VK_* entries
+
+    // must be deleted before exit(), so delete it in DeInitSalData()
+    std::unique_ptr<TextOutRenderer> m_pTextOutRenderer;
 };
 
 inline void SetSalData( SalData* pData ) { ImplGetSVData()->mpSalData = pData; }
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<TextOutRenderer> _impl(D2DWriteTextOutRenderer::InitModules()
-            ? static_cast<TextOutRenderer*>(new D2DWriteTextOutRenderer())
-            : static_cast<TextOutRenderer*>(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<TextOutRenderer> _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;
 }
 
 


More information about the Libreoffice-commits mailing list