summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2020-08-04 11:23:16 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2020-08-04 14:58:14 +0200
commit7959953e990b9fc10dbffd5a92553037d2b419c2 (patch)
tree77aaac7d621314778f3510be130c959cb67b5e88 /sc
parent8c8543ed7f554eb9b26456dbeba6614e26699c89 (diff)
fix leak in CppunitTest_sc_ucalc
Change-Id: Iee5f4bfcd8ad90d37e787d225928a5ae7b269f2d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100048 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/document.hxx11
-rw-r--r--sc/source/core/data/documen2.cxx9
-rw-r--r--sc/source/core/data/document.cxx19
3 files changed, 18 insertions, 21 deletions
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index f2ceca43fcbf..69e0b06a6cab 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -296,14 +296,11 @@ const sal_uInt8 SC_DDE_IGNOREMODE = 255; /// For usage in FindDdeLink()
// During threaded calculation fields being mutated are kept in this struct
struct ScDocumentThreadSpecific
{
- ScRecursionHelper* pRecursionHelper; // information for recursive and iterative cell formulas
+ std::unique_ptr<ScRecursionHelper> xRecursionHelper; // information for recursive and iterative cell formulas
ScInterpreterContext* pContext; // references the context passed around for easier access
- ScDocumentThreadSpecific()
- : pRecursionHelper(nullptr)
- , pContext(nullptr)
- {
- }
+ ScDocumentThreadSpecific();
+ ~ScDocumentThreadSpecific();
// To be called in the thread at start
static void SetupFromNonThreadedData(const ScDocumentThreadSpecific& rNonThreadedData);
@@ -2225,8 +2222,6 @@ private:
DECL_LINK(TrackTimeHdl, Timer *, void);
- static ScRecursionHelper* CreateRecursionHelperInstance();
-
/** Adjust a range to available sheets.
Used to start and stop listening on a sane range. Both o_rRange and
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 9b966c8d5cf5..e4413853aa71 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -387,8 +387,8 @@ ScDocument::~ScDocument()
mxPoolHelper.clear();
pScriptTypeData.reset();
- delete maNonThreaded.pRecursionHelper;
- delete maThreadSpecific.pRecursionHelper;
+ maNonThreaded.xRecursionHelper.reset();
+ maThreadSpecific.xRecursionHelper.reset();
pPreviewFont.reset();
SAL_WARN_IF( pAutoNameCache, "sc.core", "AutoNameCache still set in dtor" );
@@ -1148,11 +1148,6 @@ void ScDocument::DisposeFieldEditEngine(std::unique_ptr<ScFieldEditEngine>& rpEd
rpEditEngine.reset();
}
-ScRecursionHelper* ScDocument::CreateRecursionHelperInstance()
-{
- return new ScRecursionHelper;
-}
-
ScLookupCache & ScDocument::GetLookupCache( const ScRange & rRange, ScInterpreterContext* pContext )
{
ScLookupCache* pCache = nullptr;
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index 32154717bd29..1b998a0da97b 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -85,6 +85,7 @@
#include <compressedarray.hxx>
#include <docsh.hxx>
#include <brdcst.hxx>
+#include <recursionhelper.hxx>
#include <formula/vectortoken.hxx>
@@ -6809,15 +6810,15 @@ ScRecursionHelper& ScDocument::GetRecursionHelper()
{
if (!IsThreadedGroupCalcInProgress())
{
- if (!maNonThreaded.pRecursionHelper)
- maNonThreaded.pRecursionHelper = CreateRecursionHelperInstance();
- return *maNonThreaded.pRecursionHelper;
+ if (!maNonThreaded.xRecursionHelper)
+ maNonThreaded.xRecursionHelper = std::make_unique<ScRecursionHelper>();
+ return *maNonThreaded.xRecursionHelper;
}
else
{
- if (!maThreadSpecific.pRecursionHelper)
- maThreadSpecific.pRecursionHelper = CreateRecursionHelperInstance();
- return *maThreadSpecific.pRecursionHelper;
+ if (!maThreadSpecific.xRecursionHelper)
+ maThreadSpecific.xRecursionHelper = std::make_unique<ScRecursionHelper>();
+ return *maThreadSpecific.xRecursionHelper;
}
}
@@ -6832,6 +6833,12 @@ void ScDocumentThreadSpecific::MergeBackIntoNonThreadedData(ScDocumentThreadSpec
// What about recursion helper and lookup cache?
}
+ScDocumentThreadSpecific::ScDocumentThreadSpecific()
+ : pContext(nullptr)
+{}
+
+ScDocumentThreadSpecific::~ScDocumentThreadSpecific() {}
+
void ScDocument::SetupFromNonThreadedContext(ScInterpreterContext& /*threadedContext*/, int /*threadNumber*/)
{
// lookup cache is now only in pooled ScInterpreterContext's