[Libreoffice-commits] core.git: Branch 'libreoffice-6-2' - sw/inc sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Fri Dec 14 14:00:40 UTC 2018


 sw/inc/doc.hxx                |   30 ++++++++++++++----------------
 sw/source/core/doc/docfmt.cxx |   20 +++++++++++---------
 sw/source/core/doc/docnew.cxx |    5 +++--
 3 files changed, 28 insertions(+), 27 deletions(-)

New commits:
commit 6c2047e3d0806b872da53f4a23cc059423d31a5a
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Wed Dec 12 13:40:10 2018 +0000
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Fri Dec 14 15:00:09 2018 +0100

    crashtesting: intermittent threaded crash
    
    race in SwDoc::CreateNumberFormatter on thread unsafe mpNumberFormatter.
    
    thread 1:
    SwDoc::CreateNumberFormatter
    SwDoc::GetNumberFormatter
    ...
    sw::DocumentTimerManager::DoIdleJobs
    Timer::Invoke
    
    thread 2:
    SwDoc::CreateNumberFormatter
    SwDoc::GetNumberFormatter
    SwXTextDocument::GetNumberFormatter();
    SwXTextDocument::queryInterface
    ...
    SvXMLExport::setSourceDocument
    SvXMLNumFmtExport::SvXMLNumFmtExport
    
    Change-Id: Iad9aa9514c9de61eb40256b954d0444d9fc9d81e
    Reviewed-on: https://gerrit.libreoffice.org/65044
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index a12024ffbd36..30e38908c72d 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -39,6 +39,7 @@
 #include "tblenum.hxx"
 #include "ndarr.hxx"
 #include "ndtyp.hxx"
+#include <atomic>
 #include <memory>
 #include <set>
 #include <unordered_map>
@@ -258,7 +259,7 @@ class SW_DLLPUBLIC SwDoc final
     std::unique_ptr<SwAutoCorrExceptWord> mpACEWord;               /**< For the automated takeover of
                                                    auto-corrected words that are "re-corrected". */
     std::unique_ptr<SwURLStateChanged> mpURLStateChgd;             //< SfxClient for changes in INetHistory
-    std::unique_ptr<SvNumberFormatter> mpNumberFormatter;          //< NumFormatter for tables / fields
+    std::atomic<SvNumberFormatter*> mpNumberFormatter;             //< NumFormatter for tables / fields
 
     mutable std::unique_ptr<SwNumRuleTable> mpNumRuleTable;     //< List of all named NumRules.
 
@@ -347,7 +348,7 @@ private:
                                 const OUString& rFormula,
                                 std::vector<OUString>& rUsedDBNames );
 
-    void CreateNumberFormatter();
+    void EnsureNumberFormatter();
 
     bool UnProtectTableCells( SwTable& rTable );
 
@@ -1382,8 +1383,17 @@ public:
             SwRootFrame const* pLayout = nullptr);
 
     // Query NumberFormatter.
-    inline       SvNumberFormatter* GetNumberFormatter( bool bCreate = true );
-    inline const SvNumberFormatter* GetNumberFormatter( bool bCreate = true ) const;
+    SvNumberFormatter* GetNumberFormatter(bool bCreate = true)
+    {
+        if (bCreate)
+            EnsureNumberFormatter();
+        return mpNumberFormatter;
+    }
+
+    const SvNumberFormatter* GetNumberFormatter(bool bCreate = true) const
+    {
+        return const_cast<SwDoc*>(this)->GetNumberFormatter(bCreate);
+    }
 
     bool HasInvisibleContent() const;
     // delete invisible content, like hidden sections and paragraphs
@@ -1634,18 +1644,6 @@ inline const SwTableNode* SwDoc::IsIdxInTable( const SwNodeIndex& rIdx ) const
     return const_cast<SwDoc*>(this)->IsIdxInTable( rIdx );
 }
 
-inline SvNumberFormatter* SwDoc::GetNumberFormatter( bool bCreate )
-{
-    if( bCreate && !mpNumberFormatter )
-        CreateNumberFormatter();
-    return mpNumberFormatter.get();
-}
-
-inline const SvNumberFormatter* SwDoc::GetNumberFormatter( bool bCreate ) const
-{
-    return const_cast<SwDoc*>(this)->GetNumberFormatter( bCreate );
-}
-
 inline void SwDoc::SetOLEPrtNotifyPending( bool bSet )
 {
     mbOLEPrtNotifyPending = bSet;
diff --git a/sw/source/core/doc/docfmt.cxx b/sw/source/core/doc/docfmt.cxx
index d29d7314c9b0..8783623f6ab6 100644
--- a/sw/source/core/doc/docfmt.cxx
+++ b/sw/source/core/doc/docfmt.cxx
@@ -30,6 +30,7 @@
 #include <editeng/colritem.hxx>
 #include <svl/whiter.hxx>
 #include <svl/zforlist.hxx>
+#include <comphelper/doublecheckedinit.hxx>
 #include <comphelper/processfactory.hxx>
 #include <unotools/configmgr.hxx>
 #include <unotools/misccfg.hxx>
@@ -1731,16 +1732,17 @@ SwTableLineFormat* SwDoc::MakeTableLineFormat()
     return pFormat;
 }
 
-void SwDoc::CreateNumberFormatter()
+void SwDoc::EnsureNumberFormatter()
 {
-    OSL_ENSURE( !mpNumberFormatter, "is already there" );
-
-    LanguageType eLang = LANGUAGE_SYSTEM;
-
-    mpNumberFormatter.reset( new SvNumberFormatter( comphelper::getProcessComponentContext(), eLang ) );
-    mpNumberFormatter->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
-    if (!utl::ConfigManager::IsFuzzing())
-        mpNumberFormatter->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
+    comphelper::doubleCheckedInit(mpNumberFormatter, []()
+    {
+        LanguageType eLang = LANGUAGE_SYSTEM;
+        SvNumberFormatter* pRet = new SvNumberFormatter(comphelper::getProcessComponentContext(), eLang);
+        pRet->SetEvalDateFormat( NF_EVALDATEFORMAT_FORMAT_INTL );
+        if (!utl::ConfigManager::IsFuzzing())
+            pRet->SetYear2000(static_cast<sal_uInt16>(::utl::MiscCfg().GetYear2000()));
+        return pRet;
+    });
 }
 
 SwTableNumFormatMerge::SwTableNumFormatMerge( const SwDoc& rSrc, SwDoc& rDest )
diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
index ed0f0529de6f..e48fd619d8e5 100644
--- a/sw/source/core/doc/docnew.cxx
+++ b/sw/source/core/doc/docnew.cxx
@@ -252,6 +252,7 @@ SwDoc::SwDoc()
     mpLineNumberInfo( new SwLineNumberInfo ),
     mpFootnoteIdxs( new SwFootnoteIdxs ),
     mpDocShell( nullptr ),
+    mpNumberFormatter( nullptr ),
     mpNumRuleTable( new SwNumRuleTable ),
     mpExtInputRing( nullptr ),
     mpGrammarContact(createGrammarContact()),
@@ -579,7 +580,7 @@ SwDoc::~SwDoc()
 
     disposeXForms(); // #i113606#, dispose the XForms objects
 
-    mpNumberFormatter.reset();
+    delete mpNumberFormatter.load(); mpNumberFormatter= nullptr;
     mpFootnoteInfo.reset();
     mpEndNoteInfo.reset();
     mpLineNumberInfo.reset();
@@ -736,7 +737,7 @@ void SwDoc::ClearDoc()
 
     GetDocumentFieldsManager().ClearFieldTypes();
 
-    mpNumberFormatter.reset();
+    delete mpNumberFormatter.load(); mpNumberFormatter= nullptr;
 
     getIDocumentStylePoolAccess().GetPageDescFromPool( RES_POOLPAGE_STANDARD );
     pFirstNd->ChgFormatColl( getIDocumentStylePoolAccess().GetTextCollFromPool( RES_POOLCOLL_STANDARD ));


More information about the Libreoffice-commits mailing list