summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2021-05-07 22:06:14 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2021-05-08 17:36:54 +0200
commit1545949690c750d7b512000723b564e69cf3c3a6 (patch)
tree1463c8b2912a9e269fe8b7ef3f7326dc85173830 /editeng
parentc10ce2698a3b001d22db3d33f2f43513cc49ebda (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.hxx3
-rw-r--r--editeng/qa/unit/core-test.cxx36
-rw-r--r--editeng/source/editeng/editdoc.cxx4
-rw-r--r--editeng/source/editeng/editeng.cxx9
-rw-r--r--editeng/source/editeng/editobj.cxx52
-rw-r--r--editeng/source/editeng/editobj2.hxx7
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