sc/inc/segmenttree.hxx              |    9 +++++++++
 sc/source/core/data/segmenttree.cxx |   32 ++++++++++++++++++++++++++++++++
 sc/source/core/data/table1.cxx      |    5 +++++
 3 files changed, 46 insertions(+)

New commits:
commit fb232a8d8ff143410e17bfe9672207479697e3ef
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Mon Mar 8 22:50:58 2021 +0100
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Tue Mar 9 22:25:39 2021 +0100

    fix ScFlatBoolSegmentsImpl delayed setup with threads (tdf#140754)
    
    Change-Id: I258263f6a15e7098a2292ba7f3336fcaaf5224ff
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112184
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>
    (cherry picked from commit 2fb274950e5207ca55f4f52325fb522bd44024e1)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112212
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/inc/segmenttree.hxx b/sc/inc/segmenttree.hxx
index 58e59e60cd84..7e25d232a03f 100644
--- a/sc/inc/segmenttree.hxx
+++ b/sc/inc/segmenttree.hxx
@@ -77,6 +77,9 @@ public:
 
     SCROW findLastTrue() const;
 
+    // Builds internal data (so that it doesn't build them while used in 
threads).
+    void makeReady();
+
     OString dumpAsString();
 
 private:
@@ -102,6 +105,9 @@ public:
     void removeSegment(SCCOL nCol1, SCCOL nCol2);
     void insertSegment(SCCOL nCol, SCCOL nSize);
 
+    // Builds internal data (so that it doesn't build them while used in 
threads).
+    void makeReady();
+
     OString dumpAsString();
 
 private:
@@ -153,6 +159,9 @@ public:
 
     void enableTreeSearch(bool bEnable);
 
+    // Builds internal data (so that it doesn't build them while used in 
threads).
+    void makeReady();
+
     OString dumpAsString();
 
 private:
diff --git a/sc/source/core/data/segmenttree.cxx 
b/sc/source/core/data/segmenttree.cxx
index 00033438e0f8..d6d57f0982c5 100644
--- a/sc/source/core/data/segmenttree.cxx
+++ b/sc/source/core/data/segmenttree.cxx
@@ -24,6 +24,7 @@
 #include <algorithm>
 #include <limits>
 #include <address.hxx>
+#include <global.hxx>
 
 using ::std::numeric_limits;
 
@@ -66,6 +67,8 @@ public:
         mbTreeSearchEnabled = b;
     }
 
+    void makeReady();
+
 private:
     typedef ::mdds::flat_segment_tree<SCCOLROW, ValueType> fst_type;
     fst_type maSegments;
@@ -131,7 +134,10 @@ typename ScFlatSegmentsImpl<ValueType_, 
ExtValueType_>::ValueType ScFlatSegments
     }
 
     if (!maSegments.is_tree_valid())
+    {
+        assert(!ScGlobal::bThreadedGroupCalcInProgress);
         maSegments.build_tree();
+    }
 
     maSegments.search_tree(nPos, nValue);
     return nValue;
@@ -185,7 +191,10 @@ bool ScFlatSegmentsImpl<ValueType_, 
ExtValueType_>::getRangeData(SCCOLROW nPos,
         return getRangeDataLeaf(nPos, rData);
 
     if (!maSegments.is_tree_valid())
+    {
+        assert(!ScGlobal::bThreadedGroupCalcInProgress);
         maSegments.build_tree();
+    }
 
     if (!maSegments.search_tree(nPos, rData.mnValue, &rData.mnPos1, 
&rData.mnPos2).second)
         return false;
@@ -267,6 +276,14 @@ bool ScFlatSegmentsImpl<ValueType_, 
ExtValueType_>::getNext(RangeData& rData)
     return true;
 }
 
+template<typename ValueType_, typename ExtValueType_>
+void ScFlatSegmentsImpl<ValueType_, ExtValueType_>::makeReady()
+{
+    assert(!ScGlobal::bThreadedGroupCalcInProgress);
+    if (!maSegments.is_tree_valid())
+        maSegments.build_tree();
+}
+
 class ScFlatUInt16SegmentsImpl : public ScFlatSegmentsImpl<sal_uInt16, 
sal_uInt32>
 {
 public:
@@ -416,6 +433,11 @@ SCROW ScFlatBoolRowSegments::findLastTrue() const
     return mpImpl->findLastTrue(false);
 }
 
+void ScFlatBoolRowSegments::makeReady()
+{
+    mpImpl->makeReady();
+}
+
 OString ScFlatBoolRowSegments::dumpAsString()
 {
     OString aOutput;
@@ -483,6 +505,11 @@ void ScFlatBoolColSegments::insertSegment(SCCOL nCol, 
SCCOL nSize)
     mpImpl->insertSegment(static_cast<SCCOLROW>(nCol), 
static_cast<SCCOLROW>(nSize), true/*bSkipStartBoundary*/);
 }
 
+void ScFlatBoolColSegments::makeReady()
+{
+    mpImpl->makeReady();
+}
+
 OString ScFlatBoolColSegments::dumpAsString()
 {
     OString aOutput;
@@ -596,6 +623,11 @@ void ScFlatUInt16RowSegments::setValueIf(SCROW nRow1, 
SCROW nRow2, sal_uInt16 nV
     mpImpl->setValueIf(static_cast<SCCOLROW>(nRow1), 
static_cast<SCCOLROW>(nRow2), nValue, rPredicate);
 }
 
+void ScFlatUInt16RowSegments::makeReady()
+{
+    mpImpl->makeReady();
+}
+
 OString ScFlatUInt16RowSegments::dumpAsString()
 {
     OString aOutput;
diff --git a/sc/source/core/data/table1.cxx b/sc/source/core/data/table1.cxx
index 19ddf61770de..11ac1f1d3e83 100644
--- a/sc/source/core/data/table1.cxx
+++ b/sc/source/core/data/table1.cxx
@@ -2460,6 +2460,11 @@ bool ScTable::HandleRefArrayForParallelism( SCCOL nCol, 
SCROW nRow1, SCROW nRow2
     if ( !IsColValid( nCol ) || !ValidRow( nRow1 ) || !ValidRow( nRow2 ) )
         return false;
 
+    mpHiddenCols->makeReady();
+    mpHiddenRows->makeReady();
+    mpFilteredCols->makeReady();
+    mpFilteredRows->makeReady();
+
     return aCol[nCol].HandleRefArrayForParallelism(nRow1, nRow2, mxGroup);
 }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to