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.michael...@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 <c...@libreoffice.org> Reviewed-by: Björn Michaelsen <bjoern.michael...@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(); };
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits