[Libreoffice-commits] core.git: editeng/source include/editeng

Bjoern Michaelsen bjoern.michaelsen at canonical.com
Fri Mar 10 13:01:41 UTC 2017


 editeng/source/editeng/eerdll.cxx   |   34 ++++++++++++++++++++++++----------
 editeng/source/editeng/eerdll2.hxx  |   16 +++++++++++++---
 editeng/source/editeng/impedit.hxx  |    2 ++
 editeng/source/editeng/impedit2.cxx |    4 +++-
 include/editeng/eerdll.hxx          |    6 ++++++
 5 files changed, 48 insertions(+), 14 deletions(-)

New commits:
commit c54bb4a9f76a11561a7f4010382dbe46c0d2ef2a
Author: Bjoern Michaelsen <bjoern.michaelsen at canonical.com>
Date:   Thu Mar 9 03:20:19 2017 +0100

    tdf#99352: create editeng::SharedVclRessources
    
    - instead of keeping vcl resources in a rtl::Static
    - these are shared owned by all EditEngines
    - they let go of them when disposed
    - thus, this should prevent VclPtrs to leak beyond dispose()
    
    Change-Id: Ic6198c19d0ff9c09ecdea377d07807f08711d6a0
    Reviewed-on: https://gerrit.libreoffice.org/34986
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Björn Michaelsen <bjoern.michaelsen at canonical.com>

diff --git a/editeng/source/editeng/eerdll.cxx b/editeng/source/editeng/eerdll.cxx
index 09b9909..a73d7eb 100644
--- a/editeng/source/editeng/eerdll.cxx
+++ b/editeng/source/editeng/eerdll.cxx
@@ -85,11 +85,8 @@ EditDLL& EditDLL::Get()
 }
 
 GlobalEditData::GlobalEditData() :
-    ppDefItems(nullptr),
-    mpVirDev(VclPtr<VirtualDevice>::Create())
-{
-    mpVirDev->SetMapMode(MapUnit::MapTwip);
-}
+    ppDefItems(nullptr)
+{ }
 
 GlobalEditData::~GlobalEditData()
 {
@@ -197,11 +194,6 @@ uno::Reference< linguistic2::XLanguageGuessing > const & GlobalEditData::GetLang
     return xLanguageGuesser;
 }
 
-VclPtr<VirtualDevice> GlobalEditData::GetStdVirtualDevice()
-{
-    return mpVirDev;
-}
-
 EditResId::EditResId(sal_uInt16 nId)
     : ResId(nId, *EditDLL::GetResMgr())
 {
@@ -225,4 +217,26 @@ ResMgr* EditDLL::GetResMgr()
     return pResMgr;
 }
 
+
+editeng::SharedVclResources::SharedVclResources()
+    : m_pVirDev(VclPtr<VirtualDevice>::Create())
+{
+    m_pVirDev->SetMapMode(MapUnit::MapTwip);
+}
+
+editeng::SharedVclResources::~SharedVclResources()
+    { m_pVirDev.disposeAndClear(); }
+
+VclPtr<VirtualDevice> editeng::SharedVclResources::GetVirtualDevice()
+    { return m_pVirDev; }
+
+std::shared_ptr<editeng::SharedVclResources> EditDLL::GetSharedVclResources()
+{
+    SolarMutexGuard g;
+    auto pLocked(pSharedVcl.lock());
+    if(!pLocked)
+        pSharedVcl = pLocked = std::shared_ptr<editeng::SharedVclResources>(new editeng::SharedVclResources());
+    return pLocked;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/editeng/source/editeng/eerdll2.hxx b/editeng/source/editeng/eerdll2.hxx
index 32c7c40..75bfb21 100644
--- a/editeng/source/editeng/eerdll2.hxx
+++ b/editeng/source/editeng/eerdll2.hxx
@@ -27,6 +27,19 @@
 class SfxPoolItem;
 class VirtualDevice;
 
+namespace editeng
+{
+    class SharedVclResources
+    {
+        private:
+            VclPtr<VirtualDevice> m_pVirDev;
+        public:
+            SharedVclResources();
+            ~SharedVclResources();
+            VclPtr<VirtualDevice> GetVirtualDevice();
+    };
+}
+
 class GlobalEditData
 {
 private:
@@ -34,7 +47,6 @@ private:
     std::vector<SfxPoolItem*>*   ppDefItems;
 
     rtl::Reference<SvxForbiddenCharactersTable> xForbiddenCharsTable;
-    VclPtr<VirtualDevice> mpVirDev;
 
 public:
                     GlobalEditData();
@@ -45,8 +57,6 @@ public:
     rtl::Reference<SvxForbiddenCharactersTable> const & GetForbiddenCharsTable();
     void            SetForbiddenCharsTable( rtl::Reference<SvxForbiddenCharactersTable> const & xForbiddenChars ) { xForbiddenCharsTable = xForbiddenChars; }
     css::uno::Reference< css::linguistic2::XLanguageGuessing > const & GetLanguageGuesser();
-
-    VclPtr<VirtualDevice> GetStdVirtualDevice();
 };
 
 #endif // INCLUDED_EDITENG_SOURCE_EDITENG_EERDLL2_HXX
diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx
index 106221f..e8d2cea 100644
--- a/editeng/source/editeng/impedit.hxx
+++ b/editeng/source/editeng/impedit.hxx
@@ -19,6 +19,7 @@
 #ifndef INCLUDED_EDITENG_SOURCE_EDITENG_IMPEDIT_HXX
 #define INCLUDED_EDITENG_SOURCE_EDITENG_IMPEDIT_HXX
 
+#include <eerdll2.hxx>
 #include <editdoc.hxx>
 #include <editsel.hxx>
 #include <editundo.hxx>
@@ -397,6 +398,7 @@ class ImpEditEngine : public SfxListener
     typedef EditEngine::ViewsType ViewsType;
 
 private:
+    std::shared_ptr<editeng::SharedVclResources> pSharedVCL;
 
 
     // Data ...
diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx
index 3338111..506477f 100644
--- a/editeng/source/editeng/impedit2.cxx
+++ b/editeng/source/editeng/impedit2.cxx
@@ -84,6 +84,7 @@ static sal_uInt16 lcl_CalcExtraSpace( ParaPortion*, const SvxLineSpacingItem& rL
 }
 
 ImpEditEngine::ImpEditEngine( EditEngine* pEE, SfxItemPool* pItemPool ) :
+    pSharedVCL(EditDLL::Get().GetSharedVclResources()),
     aPaperSize( 0x7FFFFFFF, 0x7FFFFFFF ),
     aMinAutoPaperSize( 0x0, 0x0 ),
     aMaxAutoPaperSize( 0x7FFFFFFF, 0x7FFFFFFF ),
@@ -175,6 +176,7 @@ void ImpEditEngine::Dispose()
         EndListening(*pApp);
     pVirtDev.disposeAndClear();
     mpOwnDev.disposeAndClear();
+    pSharedVCL.reset();
 }
 
 ImpEditEngine::~ImpEditEngine()
@@ -204,7 +206,7 @@ void ImpEditEngine::SetRefDevice( OutputDevice* pRef )
     if (pRef)
         pRefDev = pRef;
     else
-        pRefDev = EditDLL::Get().GetGlobalData()->GetStdVirtualDevice();
+        pRefDev = pSharedVCL->GetVirtualDevice();
 
     nOnePixelInRef = (sal_uInt16)pRefDev->PixelToLogic( Size( 1, 0 ) ).Width();
 
diff --git a/include/editeng/eerdll.hxx b/include/editeng/eerdll.hxx
index 74034f2..928f560 100644
--- a/include/editeng/eerdll.hxx
+++ b/include/editeng/eerdll.hxx
@@ -21,6 +21,10 @@
 #define INCLUDED_EDITENG_EERDLL_HXX
 
 class GlobalEditData;
+namespace editeng
+{
+    class SharedVclResources;
+}
 
 #include <tools/resid.hxx>
 #include <editeng/editengdllapi.h>
@@ -35,6 +39,7 @@ public:
 class EditDLL
 {
     std::unique_ptr<GlobalEditData> pGlobalData;
+    std::weak_ptr<editeng::SharedVclResources> pSharedVcl;
 
 public:
     EditDLL();
@@ -42,6 +47,7 @@ public:
 
     static ResMgr* GetResMgr();
     GlobalEditData* GetGlobalData() const   { return pGlobalData.get(); }
+    std::shared_ptr<editeng::SharedVclResources> GetSharedVclResources();
     static EditDLL& Get();
 };
 


More information about the Libreoffice-commits mailing list