summaryrefslogtreecommitdiff
path: root/sw/source/core/ole/ndole.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/ole/ndole.cxx')
-rw-r--r--sw/source/core/ole/ndole.cxx46
1 files changed, 41 insertions, 5 deletions
diff --git a/sw/source/core/ole/ndole.cxx b/sw/source/core/ole/ndole.cxx
index bc8ba1ab5ce7..a565f40cacaf 100644
--- a/sw/source/core/ole/ndole.cxx
+++ b/sw/source/core/ole/ndole.cxx
@@ -644,6 +644,38 @@ bool SwOLENode::IsChart() const
}
//////////////////////////////////////////////////////////////////////////////
+// due to some problems in test cases with the SharedOptimalPool, I have to
+// use an own iinstance of comphelper::ThreadPool. Prtoblem is that other
+// usages of getSharedOptimalPool() may interfere when more than one pool
+// user calls waitUntilEmpty().
+//
+// It gets created on-demand and will be available during LO's lifetime for
+// loading chart models used in writer in parallel.
+// It would be possible to add a usage count, then trigger
+// a timer and clean it up (due to lifetime issues), but that's unnecessarily
+// complicated. It gets created on demand, is ready for global reuse and makes
+// no harm (not much ressources needed)
+
+static comphelper::ThreadPool* pLocalPool = 0;
+
+comphelper::ThreadPool* getLocalThreadPool()
+{
+ if (pLocalPool)
+ {
+ return pLocalPool;
+ }
+
+ if (0 == comphelper::ThreadPool::getSharedOptimalPool().getWorkerCount())
+ {
+ return nullptr;
+ }
+
+ pLocalPool = new comphelper::ThreadPool(comphelper::ThreadPool::getSharedOptimalPool().getWorkerCount());
+ return pLocalPool;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+// class holding local data for a parellel executed task to load a chart model
class DeflateData
{
@@ -703,6 +735,7 @@ public:
};
//////////////////////////////////////////////////////////////////////////////
+// class defining a parellel executed task to load a chart model
class DeflateThread : public comphelper::ThreadTask
{
@@ -1048,13 +1081,16 @@ drawinglayer::primitive2d::Primitive2DContainer SwOLEObj::tryToGetChartContentAs
if(aXModel.is())
{
- // due to some problems in test cases with the SharedOptimalPool,
- // I need to deactivate this for now
- static bool bAnynchronousLoadingAllowed = false;
+ // added using own instance of comphelper::ThreadPool, see
+ // getLocalThreadPool(). I ran the UnitTests and the problems from
+ // before seem solved, so I optionally allow asynchronous loading
+ // for now. The static bool below is an anchor point to allow
+ // deactivating this feature quickly if trouble surfaces somewhere
+ static bool bAnynchronousLoadingAllowed = true;
if(bSynchron ||
!bAnynchronousLoadingAllowed ||
- 0 == comphelper::ThreadPool::getSharedOptimalPool().getWorkerCount())
+ nullptr == getLocalThreadPool())
{
// load chart synchron in this Thread
m_aPrimitive2DSequence = ChartHelper::tryToGetChartContentAsPrimitive2DSequence(
@@ -1070,7 +1106,7 @@ drawinglayer::primitive2d::Primitive2DContainer SwOLEObj::tryToGetChartContentAs
{
m_pDeflateData = new DeflateData(aXModel);
DeflateThread* pNew = new DeflateThread(*m_pDeflateData);
- comphelper::ThreadPool::getSharedOptimalPool().pushTask(pNew);
+ getLocalThreadPool()->pushTask(pNew);
}
}
}