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

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Mar 4 14:23:59 UTC 2019


 compilerplugins/clang/badstatics.cxx       |    2 ++
 sc/inc/document.hxx                        |    3 +--
 sc/inc/global.hxx                          |    2 +-
 sc/inc/interpretercontext.hxx              |   12 +++++++++---
 sc/source/core/data/table3.cxx             |    4 ++--
 sc/source/core/tool/interpretercontext.cxx |    7 +++++++
 6 files changed, 22 insertions(+), 8 deletions(-)

New commits:
commit 233c9a12fd578e9a518cf6841d186f2f884d594d
Author:     Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Mon Feb 25 15:45:43 2019 +0100
Commit:     Michael Meeks <michael.meeks at collabora.com>
CommitDate: Mon Mar 4 15:23:36 2019 +0100

    do not call GetFormatTable() from GetNonThreadedContext() (tdf#121949)
    
    ScDocument dtor calls ClearLookupCaches(), which calls GetNonThreadedContext().
    But ScDocument instances used for copy&paste GetFormatTable() fails
    on null mxPoolHelper, because ScDocument ctor doesn't set it in such a case.
    So set up the pointer in ScInterpreterContext on demand only if actually
    needed.
    
    Change-Id: If3811da5bb00a2d7d404c089ee1bf46037a2cddb
    Reviewed-on: https://gerrit.libreoffice.org/68350
    Tested-by: Jenkins
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    (cherry picked from commit b5c3f38cb8d4121e3303be362e0757d3d3431059)
    Reviewed-on: https://gerrit.libreoffice.org/68539

diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx
index 39b99e6de71e..d25b842da0d0 100644
--- a/compilerplugins/clang/badstatics.cxx
+++ b/compilerplugins/clang/badstatics.cxx
@@ -201,6 +201,8 @@ public:
                     .Class("ScDocument").GlobalNamespace()) // not owning
                 || name == "s_pLOKWindowsMap" // LOK only, guarded by assert, and LOK never tries to perform a VCL cleanup
                 || name == "gStaticManager" // vcl/source/graphic/Manager.cxx - stores non-owning pointers
+                || name == "aThreadedInterpreterPool"    // ScInterpreterContext(Pool), not owning
+                || name == "aNonThreadedInterpreterPool" // ScInterpreterContext(Pool), not owning
                ) // these variables appear unproblematic
             {
                 return true;
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index 6a584b47d0a8..3fbe9cd899d5 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -582,8 +582,7 @@ public:
 
     ScInterpreterContext& GetNonThreadedContext() const
     {
-        // GetFormatTable() asserts that we are not in a threaded calculation
-        maInterpreterContext.mpFormatter = GetFormatTable();
+        assert(!IsThreadedGroupCalcInProgress());
         return maInterpreterContext;
     }
     // Uses thread_local.
diff --git a/sc/inc/global.hxx b/sc/inc/global.hxx
index e6a33de7830b..176cfe124518 100644
--- a/sc/inc/global.hxx
+++ b/sc/inc/global.hxx
@@ -809,7 +809,7 @@ public:
             SvNumberFormatter* pFormatter, SvNumFormatType & rCurFmtType );
 
     /// Calc's threaded group calculation is in progress.
-    static bool bThreadedGroupCalcInProgress;
+    SC_DLLPUBLIC static bool bThreadedGroupCalcInProgress;
 };
 
 // maybe move to dbdata.hxx (?):
diff --git a/sc/inc/interpretercontext.hxx b/sc/inc/interpretercontext.hxx
index 2f3e33040702..9fb2bc3993c5 100644
--- a/sc/inc/interpretercontext.hxx
+++ b/sc/inc/interpretercontext.hxx
@@ -37,7 +37,6 @@ class ScInterpreterContextPool;
 struct ScInterpreterContext
 {
     const ScDocument* mpDoc;
-    SvNumberFormatter* mpFormatter;
     size_t mnTokenCachePos;
     std::vector<formula::FormulaToken*> maTokens;
     std::vector<DelayedSetNumberFormat> maDelayedSetNumberFormat;
@@ -48,10 +47,10 @@ struct ScInterpreterContext
 
     ScInterpreterContext(const ScDocument& rDoc, SvNumberFormatter* pFormatter)
         : mpDoc(&rDoc)
-        , mpFormatter(pFormatter)
         , mnTokenCachePos(0)
         , maTokens(TOKEN_CACHE_SIZE, nullptr)
         , mScLookupCache(nullptr)
+        , mpFormatter(pFormatter)
     {
     }
 
@@ -59,7 +58,12 @@ struct ScInterpreterContext
 
     ~ScInterpreterContext();
 
-    SvNumberFormatter* GetFormatTable() const { return mpFormatter; }
+    SvNumberFormatter* GetFormatTable() const
+    {
+        if (mpFormatter == nullptr)
+            const_cast<ScInterpreterContext*>(this)->initFormatTable();
+        return mpFormatter;
+    }
 
 private:
     friend class ScInterpreterContextPool;
@@ -67,6 +71,8 @@ private:
     void SetDocAndFormatter(const ScDocument& rDoc, SvNumberFormatter* pFormatter);
     void Cleanup();
     void ClearLookupCache();
+    void initFormatTable();
+    SvNumberFormatter* mpFormatter;
 };
 
 class ScThreadedInterpreterContextGetterGuard;
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index 7ffd5dfec926..f4c43af65a96 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -2409,7 +2409,7 @@ public:
         {
             sal_uInt32 nNumFmt = pContext ? mrTab.GetNumberFormat(*pContext, ScAddress(nCol, nRow, mrTab.GetTab())) :
                 mrTab.GetNumberFormat(nCol, nRow);
-            SvNumberFormatter* pFormatter = pContext ? pContext->mpFormatter : mrDoc.GetFormatTable();
+            SvNumberFormatter* pFormatter = pContext ? pContext->GetFormatTable() : mrDoc.GetFormatTable();
             const SvNumberformat* pEntry = pFormatter->GetEntry(nNumFmt);
             if (pEntry)
             {
@@ -2483,7 +2483,7 @@ public:
                 sal_uInt32 nFormat = pContext ? mrTab.GetNumberFormat( *pContext, ScAddress(static_cast<SCCOL>(rEntry.nField), nRow, mrTab.GetTab()) ) :
                     mrTab.GetNumberFormat( static_cast<SCCOL>(rEntry.nField), nRow );
                 OUString aStr;
-                SvNumberFormatter* pFormatter = pContext ? pContext->mpFormatter : mrDoc.GetFormatTable();
+                SvNumberFormatter* pFormatter = pContext ? pContext->GetFormatTable() : mrDoc.GetFormatTable();
                 ScCellFormat::GetInputString(rCell, nFormat, aStr, *pFormatter, &mrDoc);
                 return compareByStringComparator(rEntry, rItem, nullptr, &aStr);
             }
diff --git a/sc/source/core/tool/interpretercontext.cxx b/sc/source/core/tool/interpretercontext.cxx
index bc67afca039c..b997effe13c4 100644
--- a/sc/source/core/tool/interpretercontext.cxx
+++ b/sc/source/core/tool/interpretercontext.cxx
@@ -18,6 +18,8 @@
  */
 
 #include <interpretercontext.hxx>
+
+#include <document.hxx>
 #include <formula/token.hxx>
 #include <lookupcache.hxx>
 #include <algorithm>
@@ -47,6 +49,11 @@ void ScInterpreterContext::SetDocAndFormatter(const ScDocument& rDoc, SvNumberFo
     mpFormatter = pFormatter;
 }
 
+void ScInterpreterContext::initFormatTable()
+{
+    mpFormatter = mpDoc->GetFormatTable(); // will assert if not main thread
+}
+
 void ScInterpreterContext::Cleanup()
 {
     // Do not disturb mScLookupCache


More information about the Libreoffice-commits mailing list