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

Caolán McNamara caolanm at redhat.com
Wed Jul 5 15:40:55 UTC 2017


 editeng/source/editeng/editdoc.cxx |    5 -
 editeng/source/editeng/editdoc.hxx |   13 +-
 editeng/source/editeng/eerdll.cxx  |  166 ++++++++++++++++++-------------------
 editeng/source/editeng/eerdll2.hxx |   18 ++--
 include/svl/itempool.hxx           |    3 
 svl/source/items/itempool.cxx      |    5 -
 6 files changed, 110 insertions(+), 100 deletions(-)

New commits:
commit 9eed346b0b745f0598eefc572c789d58353b5e31
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Jun 16 14:13:33 2017 +0100

    crash on exit of cppunit tests
    
    rework EditEngineItemPools own their default items
    and use a global weak_ptr to share them between instances
    
    Change-Id: Ifda3619a175eba3fcad81918c71b16a4d6dd663a
    Reviewed-on: https://gerrit.libreoffice.org/38885
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/editeng/source/editeng/editdoc.cxx b/editeng/source/editeng/editdoc.cxx
index cdd538a39f23..911073fa4eb6 100644
--- a/editeng/source/editeng/editdoc.cxx
+++ b/editeng/source/editeng/editdoc.cxx
@@ -3075,12 +3075,13 @@ EditEngineItemPool::EditEngineItemPool( bool bPersistenRefCounts )
     SetVersionMap( 5, 3994, 4037, aV5Map );
     SetVersionMap( 6, 3994, 4038, aV6Map );
 
-    std::vector<SfxPoolItem*>* ppDefItems = EditDLL::Get().GetGlobalData()->GetDefItems();
-    SetDefaults( ppDefItems );
+    m_xDefItems = EditDLL::Get().GetGlobalData()->GetDefItems();
+    SetDefaults(m_xDefItems->getDefaults());
 }
 
 EditEngineItemPool::~EditEngineItemPool()
 {
+    ClearDefaults();
 }
 
 SvStream& EditEngineItemPool::Store( SvStream& rStream ) const
diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index 0984a6ffe9fa..5f490173a0e8 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -24,6 +24,7 @@
 
 #include "editattr.hxx"
 #include "edtspell.hxx"
+#include "eerdll2.hxx"
 #include <editeng/svxfont.hxx>
 #include <svl/itemset.hxx>
 #include <svl/style.hxx>
@@ -832,18 +833,16 @@ inline EditCharAttrib* GetAttrib(CharAttribList::AttribsType& rAttribs, sal_Int3
 
 void CheckOrderedList(const CharAttribList::AttribsType& rAttribs, bool bStart);
 
-
-// class EditEngineItemPool
-
 class EditEngineItemPool : public SfxItemPool
 {
+private:
+    std::shared_ptr<DefItems> m_xDefItems;
 public:
-                        EditEngineItemPool( bool bPersistenRefCounts );
+    EditEngineItemPool(bool bPersistenRefCounts);
 protected:
-                        virtual ~EditEngineItemPool() override;
+    virtual ~EditEngineItemPool() override;
 public:
-
-    virtual SvStream&   Store( SvStream& rStream ) const override;
+    virtual SvStream&   Store(SvStream& rStream) const override;
 };
 
 #endif // INCLUDED_EDITENG_SOURCE_EDITENG_EDITDOC_HXX
diff --git a/editeng/source/editeng/eerdll.cxx b/editeng/source/editeng/eerdll.cxx
index 1cb7387c563f..8176096afafc 100644
--- a/editeng/source/editeng/eerdll.cxx
+++ b/editeng/source/editeng/eerdll.cxx
@@ -25,6 +25,7 @@
 #include <vcl/settings.hxx>
 #include <com/sun/star/linguistic2/LanguageGuessing.hpp>
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
+
 #include <comphelper/processfactory.hxx>
 
 #include <svl/solar.hrc>
@@ -84,96 +85,95 @@ EditDLL& EditDLL::Get()
     return theEditDLL::get();
 }
 
-GlobalEditData::GlobalEditData() :
-    ppDefItems(nullptr)
-{ }
+DefItems::DefItems()
+{
+    ppDefItems = new std::vector<SfxPoolItem*>(EDITITEMCOUNT);
+    std::vector<SfxPoolItem*>& rDefItems = *ppDefItems;
+
+    // Paragraph attributes:
+    SvxNumRule aDefaultNumRule( SvxNumRuleFlags::NONE, 0, false );
+
+    rDefItems[0]  = new SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR );
+    rDefItems[1]  = new SvXMLAttrContainerItem( EE_PARA_XMLATTRIBS );
+    rDefItems[2]  = new SvxHangingPunctuationItem(false, EE_PARA_HANGINGPUNCTUATION);
+    rDefItems[3]  = new SvxForbiddenRuleItem(true, EE_PARA_FORBIDDENRULES);
+    rDefItems[4]  = new SvxScriptSpaceItem( true, EE_PARA_ASIANCJKSPACING );
+    rDefItems[5]  = new SvxNumBulletItem( aDefaultNumRule, EE_PARA_NUMBULLET );
+    rDefItems[6]  = new SfxBoolItem( EE_PARA_HYPHENATE, false );
+    rDefItems[7]  = new SfxBoolItem( EE_PARA_BULLETSTATE, true );
+    rDefItems[8]  = new SvxLRSpaceItem( EE_PARA_OUTLLRSPACE );
+    rDefItems[9]  = new SfxInt16Item( EE_PARA_OUTLLEVEL, -1 );
+    rDefItems[10] = new SvxBulletItem( EE_PARA_BULLET );
+    rDefItems[11] = new SvxLRSpaceItem( EE_PARA_LRSPACE );
+    rDefItems[12] = new SvxULSpaceItem( EE_PARA_ULSPACE );
+    rDefItems[13] = new SvxLineSpacingItem( 0, EE_PARA_SBL );
+    rDefItems[14] = new SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST );
+    rDefItems[15] = new SvxTabStopItem( 0, 0, SvxTabAdjust::Left, EE_PARA_TABS );
+    rDefItems[16] = new SvxJustifyMethodItem( SvxCellJustifyMethod::Auto, EE_PARA_JUST_METHOD );
+    rDefItems[17] = new SvxVerJustifyItem( SVX_VER_JUSTIFY_STANDARD, EE_PARA_VER_JUST );
+
+    // Character attributes:
+    rDefItems[18] = new SvxColorItem( Color( COL_AUTO ), EE_CHAR_COLOR );
+    rDefItems[19] = new SvxFontItem( EE_CHAR_FONTINFO );
+    rDefItems[20] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT );
+    rDefItems[21] = new SvxCharScaleWidthItem( 100, EE_CHAR_FONTWIDTH );
+    rDefItems[22] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT );
+    rDefItems[23] = new SvxUnderlineItem( LINESTYLE_NONE, EE_CHAR_UNDERLINE );
+    rDefItems[24] = new SvxCrossedOutItem( STRIKEOUT_NONE, EE_CHAR_STRIKEOUT );
+    rDefItems[25] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC );
+    rDefItems[26] = new SvxContourItem( false, EE_CHAR_OUTLINE );
+    rDefItems[27] = new SvxShadowedItem( false, EE_CHAR_SHADOW );
+    rDefItems[28] = new SvxEscapementItem( 0, 100, EE_CHAR_ESCAPEMENT );
+    rDefItems[29] = new SvxAutoKernItem( false, EE_CHAR_PAIRKERNING );
+    rDefItems[30] = new SvxKerningItem( 0, EE_CHAR_KERNING );
+    rDefItems[31] = new SvxWordLineModeItem( false, EE_CHAR_WLM );
+    rDefItems[32] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE );
+    rDefItems[33] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE_CJK );
+    rDefItems[34] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE_CTL );
+    rDefItems[35] = new SvxFontItem( EE_CHAR_FONTINFO_CJK );
+    rDefItems[36] = new SvxFontItem( EE_CHAR_FONTINFO_CTL );
+    rDefItems[37] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT_CJK );
+    rDefItems[38] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT_CTL );
+    rDefItems[39] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK );
+    rDefItems[40] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL );
+    rDefItems[41] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK );
+    rDefItems[42] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL );
+    rDefItems[43] = new SvxEmphasisMarkItem( FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK );
+    rDefItems[44] = new SvxCharReliefItem( FontRelief::NONE, EE_CHAR_RELIEF );
+    rDefItems[45] = new SfxVoidItem( EE_CHAR_RUBI_DUMMY );
+    rDefItems[46] = new SvXMLAttrContainerItem( EE_CHAR_XMLATTRIBS );
+    rDefItems[47] = new SvxOverlineItem( LINESTYLE_NONE, EE_CHAR_OVERLINE );
+    rDefItems[48] = new SvxCaseMapItem( SvxCaseMap::NotMapped, EE_CHAR_CASEMAP );
+    rDefItems[49] = new SfxGrabBagItem( EE_CHAR_GRABBAG );
+    rDefItems[50] = new SvxBackgroundColorItem( Color( COL_AUTO ), EE_CHAR_BKGCOLOR );
+    // Features
+    rDefItems[51] = new SfxVoidItem( EE_FEATURE_TAB );
+    rDefItems[52] = new SfxVoidItem( EE_FEATURE_LINEBR );
+    rDefItems[53] = new SvxCharSetColorItem( Color( COL_RED ), RTL_TEXTENCODING_DONTKNOW, EE_FEATURE_NOTCONV );
+    rDefItems[54] = new SvxFieldItem( SvxFieldData(), EE_FEATURE_FIELD );
+
+    assert(EDITITEMCOUNT == 55 && "ITEMCOUNT changed, adjust DefItems!");
+
+    // Init DefFonts:
+    GetDefaultFonts( *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO - EE_ITEMS_START]),
+                     *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO_CJK - EE_ITEMS_START]),
+                     *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO_CTL - EE_ITEMS_START]) );
+}
 
-GlobalEditData::~GlobalEditData()
+DefItems::~DefItems()
 {
-    // Destroy DefItems...
-    // Or simply keep them, since at end of execution?!
-    if ( ppDefItems )
-        SfxItemPool::ReleaseDefaults( ppDefItems, true );
+    SfxItemPool::ReleaseDefaults(ppDefItems, true);
 }
 
-std::vector<SfxPoolItem*>* GlobalEditData::GetDefItems()
+std::shared_ptr<DefItems> GlobalEditData::GetDefItems()
 {
-    if ( !ppDefItems )
+    auto xDefItems = m_xDefItems.lock();
+    if (!xDefItems)
     {
-        ppDefItems = new std::vector<SfxPoolItem*>(EDITITEMCOUNT);
-        std::vector<SfxPoolItem*>& rDefItems = *ppDefItems;
-
-        // Paragraph attributes:
-        SvxNumRule aDefaultNumRule( SvxNumRuleFlags::NONE, 0, false );
-
-        rDefItems[0]  = new SvxFrameDirectionItem( SvxFrameDirection::Horizontal_LR_TB, EE_PARA_WRITINGDIR );
-        rDefItems[1]  = new SvXMLAttrContainerItem( EE_PARA_XMLATTRIBS );
-        rDefItems[2]  = new SvxHangingPunctuationItem(false, EE_PARA_HANGINGPUNCTUATION);
-        rDefItems[3]  = new SvxForbiddenRuleItem(true, EE_PARA_FORBIDDENRULES);
-        rDefItems[4]  = new SvxScriptSpaceItem( true, EE_PARA_ASIANCJKSPACING );
-        rDefItems[5]  = new SvxNumBulletItem( aDefaultNumRule, EE_PARA_NUMBULLET );
-        rDefItems[6]  = new SfxBoolItem( EE_PARA_HYPHENATE, false );
-        rDefItems[7]  = new SfxBoolItem( EE_PARA_BULLETSTATE, true );
-        rDefItems[8]  = new SvxLRSpaceItem( EE_PARA_OUTLLRSPACE );
-        rDefItems[9]  = new SfxInt16Item( EE_PARA_OUTLLEVEL, -1 );
-        rDefItems[10] = new SvxBulletItem( EE_PARA_BULLET );
-        rDefItems[11] = new SvxLRSpaceItem( EE_PARA_LRSPACE );
-        rDefItems[12] = new SvxULSpaceItem( EE_PARA_ULSPACE );
-        rDefItems[13] = new SvxLineSpacingItem( 0, EE_PARA_SBL );
-        rDefItems[14] = new SvxAdjustItem( SvxAdjust::Left, EE_PARA_JUST );
-        rDefItems[15] = new SvxTabStopItem( 0, 0, SvxTabAdjust::Left, EE_PARA_TABS );
-        rDefItems[16] = new SvxJustifyMethodItem( SvxCellJustifyMethod::Auto, EE_PARA_JUST_METHOD );
-        rDefItems[17] = new SvxVerJustifyItem( SVX_VER_JUSTIFY_STANDARD, EE_PARA_VER_JUST );
-
-        // Character attributes:
-        rDefItems[18] = new SvxColorItem( Color( COL_AUTO ), EE_CHAR_COLOR );
-        rDefItems[19] = new SvxFontItem( EE_CHAR_FONTINFO );
-        rDefItems[20] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT );
-        rDefItems[21] = new SvxCharScaleWidthItem( 100, EE_CHAR_FONTWIDTH );
-        rDefItems[22] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT );
-        rDefItems[23] = new SvxUnderlineItem( LINESTYLE_NONE, EE_CHAR_UNDERLINE );
-        rDefItems[24] = new SvxCrossedOutItem( STRIKEOUT_NONE, EE_CHAR_STRIKEOUT );
-        rDefItems[25] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC );
-        rDefItems[26] = new SvxContourItem( false, EE_CHAR_OUTLINE );
-        rDefItems[27] = new SvxShadowedItem( false, EE_CHAR_SHADOW );
-        rDefItems[28] = new SvxEscapementItem( 0, 100, EE_CHAR_ESCAPEMENT );
-        rDefItems[29] = new SvxAutoKernItem( false, EE_CHAR_PAIRKERNING );
-        rDefItems[30] = new SvxKerningItem( 0, EE_CHAR_KERNING );
-        rDefItems[31] = new SvxWordLineModeItem( false, EE_CHAR_WLM );
-        rDefItems[32] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE );
-        rDefItems[33] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE_CJK );
-        rDefItems[34] = new SvxLanguageItem( LANGUAGE_DONTKNOW, EE_CHAR_LANGUAGE_CTL );
-        rDefItems[35] = new SvxFontItem( EE_CHAR_FONTINFO_CJK );
-        rDefItems[36] = new SvxFontItem( EE_CHAR_FONTINFO_CTL );
-        rDefItems[37] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT_CJK );
-        rDefItems[38] = new SvxFontHeightItem( 240, 100, EE_CHAR_FONTHEIGHT_CTL );
-        rDefItems[39] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CJK );
-        rDefItems[40] = new SvxWeightItem( WEIGHT_NORMAL, EE_CHAR_WEIGHT_CTL );
-        rDefItems[41] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CJK );
-        rDefItems[42] = new SvxPostureItem( ITALIC_NONE, EE_CHAR_ITALIC_CTL );
-        rDefItems[43] = new SvxEmphasisMarkItem( FontEmphasisMark::NONE, EE_CHAR_EMPHASISMARK );
-        rDefItems[44] = new SvxCharReliefItem( FontRelief::NONE, EE_CHAR_RELIEF );
-        rDefItems[45] = new SfxVoidItem( EE_CHAR_RUBI_DUMMY );
-        rDefItems[46] = new SvXMLAttrContainerItem( EE_CHAR_XMLATTRIBS );
-        rDefItems[47] = new SvxOverlineItem( LINESTYLE_NONE, EE_CHAR_OVERLINE );
-        rDefItems[48] = new SvxCaseMapItem( SvxCaseMap::NotMapped, EE_CHAR_CASEMAP );
-        rDefItems[49] = new SfxGrabBagItem( EE_CHAR_GRABBAG );
-        rDefItems[50] = new SvxBackgroundColorItem( Color( COL_AUTO ), EE_CHAR_BKGCOLOR );
-        // Features
-        rDefItems[51] = new SfxVoidItem( EE_FEATURE_TAB );
-        rDefItems[52] = new SfxVoidItem( EE_FEATURE_LINEBR );
-        rDefItems[53] = new SvxCharSetColorItem( Color( COL_RED ), RTL_TEXTENCODING_DONTKNOW, EE_FEATURE_NOTCONV );
-        rDefItems[54] = new SvxFieldItem( SvxFieldData(), EE_FEATURE_FIELD );
-
-        assert(EDITITEMCOUNT == 55 && "ITEMCOUNT changed, adjust DefItems!");
-
-        // Init DefFonts:
-        GetDefaultFonts( *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO - EE_ITEMS_START]),
-                         *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO_CJK - EE_ITEMS_START]),
-                         *static_cast<SvxFontItem*>(rDefItems[EE_CHAR_FONTINFO_CTL - EE_ITEMS_START]) );
+        xDefItems.reset(new DefItems);
+        m_xDefItems = xDefItems;
     }
-
-    return ppDefItems;
+    return xDefItems;
 }
 
 rtl::Reference<SvxForbiddenCharactersTable> const & GlobalEditData::GetForbiddenCharsTable()
diff --git a/editeng/source/editeng/eerdll2.hxx b/editeng/source/editeng/eerdll2.hxx
index 75bfb2131ae7..6ef3c20d1d92 100644
--- a/editeng/source/editeng/eerdll2.hxx
+++ b/editeng/source/editeng/eerdll2.hxx
@@ -40,19 +40,25 @@ namespace editeng
     };
 }
 
+class DefItems
+{
+public:
+    DefItems();
+    std::vector<SfxPoolItem*>* getDefaults() { return ppDefItems; }
+    ~DefItems();
+private:
+    std::vector<SfxPoolItem*>* ppDefItems;
+};
+
 class GlobalEditData
 {
 private:
     css::uno::Reference< css::linguistic2::XLanguageGuessing >  xLanguageGuesser;
-    std::vector<SfxPoolItem*>*   ppDefItems;
-
+    std::weak_ptr<DefItems> m_xDefItems;
     rtl::Reference<SvxForbiddenCharactersTable> xForbiddenCharsTable;
 
 public:
-                    GlobalEditData();
-                    ~GlobalEditData();
-
-    std::vector<SfxPoolItem*>*   GetDefItems();
+    std::shared_ptr<DefItems> GetDefItems();
 
     rtl::Reference<SvxForbiddenCharactersTable> const & GetForbiddenCharsTable();
     void            SetForbiddenCharsTable( rtl::Reference<SvxForbiddenCharactersTable> const & xForbiddenChars ) { xForbiddenCharsTable = xForbiddenChars; }
diff --git a/include/svl/itempool.hxx b/include/svl/itempool.hxx
index 151a64d367fd..eced0598bad6 100644
--- a/include/svl/itempool.hxx
+++ b/include/svl/itempool.hxx
@@ -106,7 +106,8 @@ public:
     const SfxPoolItem*              GetPoolDefaultItem( sal_uInt16 nWhich ) const;
     void                            ResetPoolDefaultItem( sal_uInt16 nWhich );
 
-    void                            SetDefaults( std::vector<SfxPoolItem*>* pDefaults );
+    void                            SetDefaults(std::vector<SfxPoolItem*>* pDefaults);
+    void                            ClearDefaults();
     void                            ReleaseDefaults( bool bDelete = false );
     static void                     ReleaseDefaults( std::vector<SfxPoolItem*> *pDefaults, bool bDelete = false );
 
diff --git a/svl/source/items/itempool.cxx b/svl/source/items/itempool.cxx
index fcd84bf6b510..1327a2bfea9c 100644
--- a/svl/source/items/itempool.cxx
+++ b/svl/source/items/itempool.cxx
@@ -257,7 +257,6 @@ SfxItemPool::SfxItemPool
         SetSecondaryPool( rPool.pImpl->mpSecondary->Clone() );
 }
 
-
 void SfxItemPool::SetDefaults( std::vector<SfxPoolItem*>* pDefaults )
 {
     DBG_ASSERT( pDefaults, "first we ask for it, and then we don't give back..." );
@@ -280,6 +279,10 @@ void SfxItemPool::SetDefaults( std::vector<SfxPoolItem*>* pDefaults )
     }
 }
 
+void SfxItemPool::ClearDefaults()
+{
+    pImpl->mpStaticDefaults = nullptr;
+}
 
 /**
  * Frees the static Defaults of the corresponding SfxItemPool instance


More information about the Libreoffice-commits mailing list