summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2017-08-02 21:33:42 +0300
committerTor Lillqvist <tml@collabora.com>2017-08-03 17:38:22 +0300
commit59a00dde20b7862ad5e5e0f208631dae6c213bb5 (patch)
tree2489c88f03b051ef8b01ba040d06836e2b2fbe4d
parent9bee38c95b2c426d3c87a30d34172aca352f0141 (diff)
Make this function multi-thread safe again
This reverts commits 633178bffaf23ae322060e2c304c9c2cf12b46cc and e6ae91a8248fceee4248aadaf9f8aadec3fcc2bc. Alternatively the static aResults could have been made thread_local. Change-Id: I3b689c49ba3b7b2ee8ccdb8ec77a9c8cb6f306d1
-rw-r--r--sc/source/core/data/table3.cxx34
1 files changed, 21 insertions, 13 deletions
diff --git a/sc/source/core/data/table3.cxx b/sc/source/core/data/table3.cxx
index c42463ab9f20..cc1857cf9d33 100644
--- a/sc/source/core/data/table3.cxx
+++ b/sc/source/core/data/table3.cxx
@@ -2659,12 +2659,14 @@ bool ScTable::ValidQuery(
if (!rParam.GetEntry(0).bDoQuery)
return true;
- SCSIZE nEntryCount = rParam.GetEntryCount();
+ //---------------------------------------------------------------
- typedef std::pair<bool,bool> ResultType;
- static std::vector<ResultType> aResults;
- if (aResults.size() < nEntryCount)
- aResults.resize(nEntryCount);
+ const SCSIZE nFixedBools = 32;
+ bool aBool[nFixedBools];
+ bool aTest[nFixedBools];
+ SCSIZE nEntryCount = rParam.GetEntryCount();
+ bool* pPasst = ( nEntryCount <= nFixedBools ? &aBool[0] : new bool[nEntryCount] );
+ bool* pTest = ( nEntryCount <= nFixedBools ? &aTest[0] : new bool[nEntryCount] );
long nPos = -1;
QueryEvaluator aEval(*pDocument, *this, rParam, pbTestEqualCondition);
@@ -2727,32 +2729,38 @@ bool ScTable::ValidQuery(
if (nPos == -1)
{
nPos++;
- aResults[nPos] = aRes;
+ pPasst[nPos] = aRes.first;
+ pTest[nPos] = aRes.second;
}
else
{
if (rEntry.eConnect == SC_AND)
{
- aResults[nPos].first = aResults[nPos].first && aRes.first;
- aResults[nPos].second = aResults[nPos].second && aRes.second;
+ pPasst[nPos] = pPasst[nPos] && aRes.first;
+ pTest[nPos] = pTest[nPos] && aRes.second;
}
else
{
nPos++;
- aResults[nPos] = aRes;
+ pPasst[nPos] = aRes.first;
+ pTest[nPos] = aRes.second;
}
}
}
for ( long j=1; j <= nPos; j++ )
{
- aResults[0].first = aResults[0].first || aResults[j].first;
- aResults[0].second = aResults[0].second || aResults[j].second;
+ pPasst[0] = pPasst[0] || pPasst[j];
+ pTest[0] = pTest[0] || pTest[j];
}
- bool bRet = aResults[0].first;
+ bool bRet = pPasst[0];
+ if ( pPasst != &aBool[0] )
+ delete [] pPasst;
if ( pbTestEqualCondition )
- *pbTestEqualCondition = aResults[0].second;
+ *pbTestEqualCondition = pTest[0];
+ if ( pTest != &aTest[0] )
+ delete [] pTest;
return bRet;
}