diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-05-07 22:06:14 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2021-05-08 17:36:54 +0200 |
commit | 1545949690c750d7b512000723b564e69cf3c3a6 (patch) | |
tree | 1463c8b2912a9e269fe8b7ef3f7326dc85173830 /editeng | |
parent | c10ce2698a3b001d22db3d33f2f43513cc49ebda (diff) |
ref-count SfxItemPool
so we can remove SfxItemPoolUser, which is a right
performance hog when we have large calc spreadsheets
Change-Id: I344002f536f6eead5cf98c6647dd1667fd9c8874
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/115247
Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'editeng')
-rw-r--r-- | editeng/inc/editdoc.hxx | 3 | ||||
-rw-r--r-- | editeng/qa/unit/core-test.cxx | 36 | ||||
-rw-r--r-- | editeng/source/editeng/editdoc.cxx | 4 | ||||
-rw-r--r-- | editeng/source/editeng/editeng.cxx | 9 | ||||
-rw-r--r-- | editeng/source/editeng/editobj.cxx | 52 | ||||
-rw-r--r-- | editeng/source/editeng/editobj2.hxx | 7 |
6 files changed, 26 insertions, 85 deletions
diff --git a/editeng/inc/editdoc.hxx b/editeng/inc/editdoc.hxx index 7017516445f6..133ea1ca9daa 100644 --- a/editeng/inc/editdoc.hxx +++ b/editeng/inc/editdoc.hxx @@ -720,7 +720,7 @@ private: mutable sal_Int32 nLastCache; std::vector<std::unique_ptr<ContentNode> > maContents; - SfxItemPool* pItemPool; + rtl::Reference<SfxItemPool> pItemPool; Link<LinkParamNone*,void> aModifyHdl; SvxFont aDefFont; //faster than ever from the pool!! @@ -729,7 +729,6 @@ private: TextRotation mnRotation; bool bIsFixedCellHeight:1; - bool bOwnerOfPool:1; bool bModified:1; bool bDisableAttributeExpanding:1; diff --git a/editeng/qa/unit/core-test.cxx b/editeng/qa/unit/core-test.cxx index 70e86b7119fa..dca5a0a8babf 100644 --- a/editeng/qa/unit/core-test.cxx +++ b/editeng/qa/unit/core-test.cxx @@ -122,10 +122,10 @@ public: CPPUNIT_TEST_SUITE_END(); private: - EditEngineItemPool* mpItemPool; + rtl::Reference<EditEngineItemPool> mpItemPool; }; -Test::Test() : mpItemPool(nullptr) {} +Test::Test() {} void Test::setUp() { @@ -138,7 +138,7 @@ void Test::setUp() void Test::tearDown() { - SfxItemPool::Free(mpItemPool); + mpItemPool.clear(); test::BootstrapFixture::tearDown(); } @@ -146,7 +146,7 @@ void Test::tearDown() void Test::testLineSpacing() { // Create EditEngine's instance - EditEngine aEditEngine(mpItemPool); + EditEngine aEditEngine(mpItemPool.get()); if(aEditEngine.GetRefDevice()->GetDPIY() != 96 || aEditEngine.GetRefDevice()->GetDPIScaleFactor() != 1.0) @@ -223,7 +223,7 @@ void Test::testLineSpacing() void Test::testConstruction() { - EditEngine aEngine(mpItemPool); + EditEngine aEngine(mpItemPool.get()); aEngine.SetText("I am Edit Engine."); } @@ -551,7 +551,7 @@ IMPL_STATIC_LINK( Test, CalcFieldValueHdl, EditFieldInfo*, pInfo, void ) void Test::testHyperlinkCopyPaste() { // Create Outliner instance - Outliner aOutliner(mpItemPool, OutlinerMode + Outliner aOutliner(mpItemPool.get(), OutlinerMode ::TextObject); aOutliner.SetCalcFieldValueHdl( LINK( nullptr, Test, CalcFieldValueHdl ) ); @@ -675,7 +675,7 @@ void Test::testHyperlinkCopyPaste() void Test::testCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -707,7 +707,7 @@ void Test::testCopyPaste() void Test::testMultiParaSelCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -752,7 +752,7 @@ void Test::testMultiParaSelCopyPaste() void Test::testTabsCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -817,7 +817,7 @@ public: // https://bugzilla.novell.com/show_bug.cgi?id=467459 void Test::testHyperlinkSearch() { - UrlEditEngine aEngine(mpItemPool); + UrlEditEngine aEngine(mpItemPool.get()); EditDoc &rDoc = aEngine.GetEditDoc(); OUString aSampleText = "Please write email to . if you find a fish(not a dog)."; @@ -902,7 +902,7 @@ bool hasItalic(const editeng::Section& rSecAttr) void Test::testBoldItalicCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1083,7 +1083,7 @@ bool hasUnderline(const editeng::Section& rSecAttr) void Test::testUnderlineCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1176,7 +1176,7 @@ void Test::testUnderlineCopyPaste() void Test::testMultiParaCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1218,7 +1218,7 @@ void Test::testMultiParaCopyPaste() void Test::testParaBoldItalicCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1489,7 +1489,7 @@ void Test::testParaBoldItalicCopyPaste() void Test::testParaStartCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1533,7 +1533,7 @@ void Test::testParaStartCopyPaste() void Test::testSectionAttributes() { - EditEngine aEngine(mpItemPool); + EditEngine aEngine(mpItemPool.get()); std::unique_ptr<SfxItemSet> pSet(new SfxItemSet(aEngine.GetEmptyItemSet())); SvxWeightItem aBold(WEIGHT_BOLD, EE_CHAR_WEIGHT); @@ -1675,7 +1675,7 @@ void Test::testSectionAttributes() void Test::testLargeParaCopyPaste() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); // Get EditDoc for current EditEngine's instance EditDoc &rDoc = aEditEngine.GetEditDoc(); @@ -1747,7 +1747,7 @@ void Test::testLargeParaCopyPaste() void Test::testTransliterate() { // Create EditEngine's instance - EditEngine aEditEngine( mpItemPool ); + EditEngine aEditEngine( mpItemPool.get() ); OUString sText("one (two) three"); aEditEngine.SetText(sText); diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx index 84ef4feae971..55415db284e6 100644 --- a/editeng/source/editeng/editdoc.cxx +++ b/editeng/source/editeng/editdoc.cxx @@ -1887,7 +1887,6 @@ EditDoc::EditDoc( SfxItemPool* pPool ) : bIsVertical(false), mnRotation(TextRotation::NONE), bIsFixedCellHeight(false), - bOwnerOfPool(pPool == nullptr), bModified(false), bDisableAttributeExpanding(false) { @@ -1897,8 +1896,6 @@ EditDoc::EditDoc( SfxItemPool* pPool ) : EditDoc::~EditDoc() { ImplDestroyContents(); - if ( bOwnerOfPool ) - SfxItemPool::Free(pItemPool); } namespace { @@ -3011,6 +3008,7 @@ EditEngineItemPool::EditEngineItemPool() EditEngineItemPool::~EditEngineItemPool() { ClearDefaults(); + SetSecondaryPool(nullptr); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/editeng/source/editeng/editeng.cxx b/editeng/source/editeng/editeng.cxx index 55481862430e..208e502f6215 100644 --- a/editeng/source/editeng/editeng.cxx +++ b/editeng/source/editeng/editeng.cxx @@ -83,7 +83,7 @@ static bool bDebugPaint = false; #endif -static std::unique_ptr<SfxItemPool, SfxItemPoolDeleter> pGlobalPool; +static rtl::Reference<SfxItemPool> pGlobalPool; EditEngine::EditEngine( SfxItemPool* pItemPool ) { @@ -2589,16 +2589,15 @@ void EditEngine::FieldClicked( const SvxFieldItem& ) // ====================== Static Methods ======================= -SfxItemPool* EditEngine::CreatePool() +rtl::Reference<SfxItemPool> EditEngine::CreatePool() { - SfxItemPool* pPool = new EditEngineItemPool(); - return pPool; + return new EditEngineItemPool(); } SfxItemPool& EditEngine::GetGlobalItemPool() { if ( !pGlobalPool ) - pGlobalPool.reset(CreatePool()); + pGlobalPool = CreatePool(); return *pGlobalPool; } diff --git a/editeng/source/editeng/editobj.cxx b/editeng/source/editeng/editobj.cxx index 0d202ac59203..e5c5cbdf4760 100644 --- a/editeng/source/editeng/editobj.cxx +++ b/editeng/source/editeng/editobj.cxx @@ -212,7 +212,6 @@ EditTextObject::EditTextObject( SfxItemPool* pPool ) : } EditTextObject::EditTextObject( const EditTextObject& r ) : - SfxItemPoolUser(), mpImpl(new EditTextObjectImpl(this, *r.mpImpl)) { } @@ -390,11 +389,6 @@ bool EditTextObject::isWrongListEqual(const EditTextObject& rCompare) const return mpImpl->isWrongListEqual(*rCompare.mpImpl); } -void EditTextObject::ObjectInDestruction(const SfxItemPool& rSfxItemPool) -{ - mpImpl->ObjectInDestruction(rSfxItemPool); -} - #if DEBUG_EDIT_ENGINE void EditTextObject::Dump() const { @@ -429,31 +423,6 @@ void EditTextObject::dumpAsXml(xmlTextWriterPtr pWriter) const } } -// from SfxItemPoolUser -void EditTextObjectImpl::ObjectInDestruction(const SfxItemPool& rSfxItemPool) -{ - if(bOwnerOfPool || pPool != &rSfxItemPool) - return; - - // The pool we are based on gets destructed; get owner of pool by creating own one. - // No need to call RemoveSfxItemPoolUser(), this is done from the pool's destructor - // Base new pool on EditEnginePool; it would also be possible to clone the used - // pool if needed, but only text attributes should be used. - SfxItemPool* pNewPool = EditEngine::CreatePool(); - - pNewPool->SetDefaultMetric(pPool->GetMetric(DEF_METRIC)); - - ContentInfosType aReplaced; - aReplaced.reserve(aContents.size()); - for (auto const& content : aContents) - aReplaced.push_back(std::unique_ptr<ContentInfo>(new ContentInfo(*content, *pNewPool))); - aReplaced.swap(aContents); - - // set local variables - pPool = pNewPool; - bOwnerOfPool = true; -} - #if DEBUG_EDIT_ENGINE void EditTextObjectImpl::Dump() const { @@ -504,12 +473,6 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, SfxItemPool* pP pPool = EditEngine::CreatePool(); bOwnerOfPool = true; } - - if(!bOwnerOfPool && pPool) - { - // it is sure now that the pool is an EditEngineItemPool - pPool->AddSfxItemPoolUser(*mpFront); - } } EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, const EditTextObjectImpl& r ) @@ -537,12 +500,6 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, const EditTextOb } - if (!bOwnerOfPool) - { - // it is sure now that the pool is an EditEngineItemPool - pPool->AddSfxItemPoolUser(*mpFront); - } - if (bOwnerOfPool && r.pPool) pPool->SetDefaultMetric( r.pPool->GetMetric( DEF_METRIC ) ); @@ -553,20 +510,11 @@ EditTextObjectImpl::EditTextObjectImpl( EditTextObject* pFront, const EditTextOb EditTextObjectImpl::~EditTextObjectImpl() { - if(!bOwnerOfPool && pPool) - { - pPool->RemoveSfxItemPoolUser(*mpFront); - } - ClearPortionInfo(); // Remove contents before deleting the pool instance since each content // has to access the pool instance in its destructor. aContents.clear(); - if ( bOwnerOfPool ) - { - SfxItemPool::Free(pPool); - } } diff --git a/editeng/source/editeng/editobj2.hxx b/editeng/source/editeng/editobj2.hxx index ba9603a7416d..3c7f171d2da5 100644 --- a/editeng/source/editeng/editobj2.hxx +++ b/editeng/source/editeng/editobj2.hxx @@ -173,7 +173,7 @@ private: EditTextObject* mpFront; ContentInfosType aContents; - SfxItemPool* pPool; + rtl::Reference<SfxItemPool> pPool; std::unique_ptr<XParaPortionList> pPortionInfo; sal_uInt16 nMetric; @@ -217,7 +217,7 @@ public: ContentInfosType& GetContents() { return aContents;} const ContentInfosType& GetContents() const { return aContents;} - SfxItemPool* GetPool() const { return pPool; } + SfxItemPool* GetPool() const { return pPool.get(); } XParaPortionList* GetPortionInfo() const { return pPortionInfo.get(); } void SetPortionInfo( std::unique_ptr<XParaPortionList> pP ) { pPortionInfo = std::move(pP); } @@ -263,9 +263,6 @@ public: // #i102062# bool isWrongListEqual(const EditTextObjectImpl& rCompare) const; - // from SfxItemPoolUser - void ObjectInDestruction(const SfxItemPool& rSfxItemPool); - #if DEBUG_EDIT_ENGINE void Dump() const; #endif |