From c54bb4a9f76a11561a7f4010382dbe46c0d2ef2a Mon Sep 17 00:00:00 2001 From: Bjoern Michaelsen Date: Thu, 9 Mar 2017 03:20:19 +0100 Subject: tdf#99352: create editeng::SharedVclRessources MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 Reviewed-by: Björn Michaelsen --- 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(-) diff --git a/editeng/source/editeng/eerdll.cxx b/editeng/source/editeng/eerdll.cxx index 09b990930d82..a73d7eb3d7b0 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::Create()) -{ - mpVirDev->SetMapMode(MapUnit::MapTwip); -} + ppDefItems(nullptr) +{ } GlobalEditData::~GlobalEditData() { @@ -197,11 +194,6 @@ uno::Reference< linguistic2::XLanguageGuessing > const & GlobalEditData::GetLang return xLanguageGuesser; } -VclPtr 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::Create()) +{ + m_pVirDev->SetMapMode(MapUnit::MapTwip); +} + +editeng::SharedVclResources::~SharedVclResources() + { m_pVirDev.disposeAndClear(); } + +VclPtr editeng::SharedVclResources::GetVirtualDevice() + { return m_pVirDev; } + +std::shared_ptr EditDLL::GetSharedVclResources() +{ + SolarMutexGuard g; + auto pLocked(pSharedVcl.lock()); + if(!pLocked) + pSharedVcl = pLocked = std::shared_ptr(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 32c7c40bbd68..75bfb2131ae7 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 m_pVirDev; + public: + SharedVclResources(); + ~SharedVclResources(); + VclPtr GetVirtualDevice(); + }; +} + class GlobalEditData { private: @@ -34,7 +47,6 @@ private: std::vector* ppDefItems; rtl::Reference xForbiddenCharsTable; - VclPtr mpVirDev; public: GlobalEditData(); @@ -45,8 +57,6 @@ public: rtl::Reference const & GetForbiddenCharsTable(); void SetForbiddenCharsTable( rtl::Reference const & xForbiddenChars ) { xForbiddenCharsTable = xForbiddenChars; } css::uno::Reference< css::linguistic2::XLanguageGuessing > const & GetLanguageGuesser(); - - VclPtr GetStdVirtualDevice(); }; #endif // INCLUDED_EDITENG_SOURCE_EDITENG_EERDLL2_HXX diff --git a/editeng/source/editeng/impedit.hxx b/editeng/source/editeng/impedit.hxx index 106221f3b195..e8d2cead0532 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 #include #include #include @@ -397,6 +398,7 @@ class ImpEditEngine : public SfxListener typedef EditEngine::ViewsType ViewsType; private: + std::shared_ptr pSharedVCL; // Data ... diff --git a/editeng/source/editeng/impedit2.cxx b/editeng/source/editeng/impedit2.cxx index 3338111fc206..506477fdb611 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 74034f249bd3..928f5603f96a 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 #include @@ -35,6 +39,7 @@ public: class EditDLL { std::unique_ptr pGlobalData; + std::weak_ptr pSharedVcl; public: EditDLL(); @@ -42,6 +47,7 @@ public: static ResMgr* GetResMgr(); GlobalEditData* GetGlobalData() const { return pGlobalData.get(); } + std::shared_ptr GetSharedVclResources(); static EditDLL& Get(); }; -- cgit v1.2.3