diff options
author | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-08-04 11:23:16 +0200 |
---|---|---|
committer | Noel Grandin <noel.grandin@collabora.co.uk> | 2020-08-04 14:58:14 +0200 |
commit | 7959953e990b9fc10dbffd5a92553037d2b419c2 (patch) | |
tree | 77aaac7d621314778f3510be130c959cb67b5e88 /sc | |
parent | 8c8543ed7f554eb9b26456dbeba6614e26699c89 (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.hxx | 11 | ||||
-rw-r--r-- | sc/source/core/data/documen2.cxx | 9 | ||||
-rw-r--r-- | sc/source/core/data/document.cxx | 19 |
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 |