[Libreoffice-commits] core.git: Branch 'feature/priorities' - comphelper/source include/comphelper sc/source

Michael Meeks michael.meeks at collabora.com
Thu Oct 30 14:58:57 PDT 2014


 comphelper/source/misc/threadpool.cxx     |    7 ++-----
 include/comphelper/threadpool.hxx         |    7 ++++++-
 sc/source/filter/oox/workbookfragment.cxx |    5 +++--
 3 files changed, 11 insertions(+), 8 deletions(-)

New commits:
commit d927998c80cb1933cb71ff33be5a7ba1dca2d411
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Thu Oct 30 21:58:36 2014 +0000

    thread-pool: re-work termination semantics to avoid problems.
    
    We want a pre-spun-up, shared thread-pool that doesn't get its
    workers created & joined frequently.
    
    Change-Id: I29081e3a3e3849ca30e63fd080ee3315d99cbe8d

diff --git a/comphelper/source/misc/threadpool.cxx b/comphelper/source/misc/threadpool.cxx
index d2101ad..236a314 100644
--- a/comphelper/source/misc/threadpool.cxx
+++ b/comphelper/source/misc/threadpool.cxx
@@ -92,7 +92,7 @@ ThreadPool::ThreadPool( sal_Int32 nWorkers ) :
 
 ThreadPool::~ThreadPool()
 {
-    waitUntilWorkersDone();
+    waitAndCleanupWorkers();
 }
 
 struct ThreadPoolStatic : public rtl::StaticWithInit< boost::shared_ptr< ThreadPool >,
@@ -109,9 +109,7 @@ ThreadPool& ThreadPool::getSharedOptimalPool()
     return *ThreadPoolStatic::get().get();
 }
 
-/// wait until all the workers have completed and
-/// terminate all threads
-void ThreadPool::waitUntilWorkersDone()
+void ThreadPool::waitAndCleanupWorkers()
 {
     waitUntilEmpty();
 
@@ -169,7 +167,6 @@ void ThreadPool::waitUntilEmpty()
             pTask->doWork();
             delete pTask;
         }
-        mbTerminate = true;
     }
     else
     {
diff --git a/include/comphelper/threadpool.hxx b/include/comphelper/threadpool.hxx
index ae103f1..2e51719 100644
--- a/include/comphelper/threadpool.hxx
+++ b/include/comphelper/threadpool.hxx
@@ -39,14 +39,19 @@ public:
                 ThreadPool( sal_Int32 nWorkers );
     virtual    ~ThreadPool();
 
+    /// push a new task onto the work queue
     void        pushTask( ThreadTask *pTask /* takes ownership */ );
+
+    /// wait until all queued tasks are completed
     void        waitUntilEmpty();
-    void        waitUntilWorkersDone();
 
 private:
     class ThreadWorker;
     friend class ThreadWorker;
 
+    /// wait until all work is completed, then join all threads
+    void        waitAndCleanupWorkers();
+
     ThreadTask *waitForWork( osl::Condition &rNewWork );
     ThreadTask *popWork();
 
diff --git a/sc/source/filter/oox/workbookfragment.cxx b/sc/source/filter/oox/workbookfragment.cxx
index 891c5aa..fbdd902 100644
--- a/sc/source/filter/oox/workbookfragment.cxx
+++ b/sc/source/filter/oox/workbookfragment.cxx
@@ -335,8 +335,9 @@ void importSheetFragments( WorkbookFragment& rWorkbookHandler, SheetFragmentVect
             // bar updating.
             Application::Yield();
         }
-        // join all the threads:
-        aPool.waitUntilWorkersDone();
+        aPool.waitUntilEmpty();
+
+        // threads joined in ThreadPool destructor
     }
     else // single threaded iteration
     {


More information about the Libreoffice-commits mailing list