compilerplugins/clang/badstatics.cxx | 2 ++ sc/inc/document.hxx | 11 +++++++++-- sc/source/core/data/documen8.cxx | 2 ++ sc/source/ui/unoobj/docuno.cxx | 3 ++- 4 files changed, 15 insertions(+), 3 deletions(-)
New commits: commit 2dbda86cca1301b81a4232a6f0c03559da5ed7f4 Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Wed Nov 7 16:01:30 2018 +0100 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Wed Nov 14 16:05:55 2018 +0100 make ScInterpreterContext also accessible without passing it around E.g. ScModelObj::GetFormatter() can be rather deep in the call chain and it just doesn't make sense to pass ScInterpreterContext* to all the relevant places (and it's a question if it makes sense to pass it around at all, googling shows that thread_local is not really _that_ slow). Change-Id: I9114ef8a10d82a10968391718099edccde7a2663 Reviewed-on: https://gerrit.libreoffice.org/63184 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/compilerplugins/clang/badstatics.cxx b/compilerplugins/clang/badstatics.cxx index 43c26558ccbc..39b99e6de71e 100644 --- a/compilerplugins/clang/badstatics.cxx +++ b/compilerplugins/clang/badstatics.cxx @@ -197,6 +197,8 @@ public: || name == "m_aUncommitedRegistrations" // sw/source/uibase/dbui/dbmgr.cxx || (loplugin::DeclCheck(pVarDecl).Var("aAllListeners") .Class("ScAddInListener").GlobalNamespace()) // not owning + || (loplugin::DeclCheck(pVarDecl).Var("maThreadSpecific") + .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 ) // these variables appear unproblematic diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx index 6fe442954901..22ce96e010ef 100644 --- a/sc/inc/document.hxx +++ b/sc/inc/document.hxx @@ -275,9 +275,11 @@ const sal_uInt8 SC_DDE_IGNOREMODE = 255; /// For usage in FindDdeLink() struct ScDocumentThreadSpecific { ScRecursionHelper* pRecursionHelper; // information for recursive and iterative cell formulas + ScInterpreterContext* pContext; // references the context passed around for easier access - ScDocumentThreadSpecific() : - pRecursionHelper(nullptr) + ScDocumentThreadSpecific() + : pRecursionHelper(nullptr) + , pContext(nullptr) { } @@ -582,6 +584,11 @@ public: maInterpreterContext.mpFormatter = GetFormatTable(); return maInterpreterContext; } + // Uses thread_local. + ScInterpreterContext& GetThreadedContext() const + { + return IsThreadedGroupCalcInProgress() ? *maThreadSpecific.pContext : GetNonThreadedContext(); + } void SetupFromNonThreadedContext( ScInterpreterContext& threadedContext, int threadNumber ); void MergeBackIntoNonThreadedContext( ScInterpreterContext& threadedContext, int threadNumber ); void SetThreadedGroupCalcInProgress( bool set ) { (void)this; ScGlobal::bThreadedGroupCalcInProgress = set; } diff --git a/sc/source/core/data/documen8.cxx b/sc/source/core/data/documen8.cxx index 84df9ff48195..943be7200a68 100644 --- a/sc/source/core/data/documen8.cxx +++ b/sc/source/core/data/documen8.cxx @@ -415,10 +415,12 @@ const ScDocumentThreadSpecific& ScDocument::CalculateInColumnInThread( ScInterpr assert(IsThreadedGroupCalcInProgress()); + maThreadSpecific.pContext = &rContext; maThreadSpecific.SetupFromNonThreadedData(maNonThreaded); pTab->CalculateInColumnInThread(rContext, rTopPos.Col(), rTopPos.Row(), nLen, nThisThread, nThreadsTotal); assert(IsThreadedGroupCalcInProgress()); + maThreadSpecific.pContext = nullptr; return maThreadSpecific; } diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx index 255e1a4ef3f4..22d75e24c58c 100644 --- a/sc/source/ui/unoobj/docuno.cxx +++ b/sc/source/ui/unoobj/docuno.cxx @@ -425,7 +425,8 @@ uno::Reference< uno::XAggregation> const & ScModelObj::GetFormatter() osl_atomic_increment( &m_refCount ); // we need a reference to SvNumberFormatsSupplierObj during queryInterface, // otherwise it'll be deleted - uno::Reference<util::XNumberFormatsSupplier> xFormatter(new SvNumberFormatsSupplierObj(pDocShell->GetDocument().GetFormatTable() )); + uno::Reference<util::XNumberFormatsSupplier> xFormatter( + new SvNumberFormatsSupplierObj(pDocShell->GetDocument().GetThreadedContext().GetFormatTable() )); { xNumberAgg.set(uno::Reference<uno::XAggregation>( xFormatter, uno::UNO_QUERY )); // extra block to force deletion of the temporary before setDelegator _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits