[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - comphelper/source desktop/source include/comphelper

Michael Meeks michael.meeks at collabora.com
Mon Apr 16 14:28:19 UTC 2018


 comphelper/source/misc/threadpool.cxx |   21 +++++++++++++++++++--
 desktop/source/lib/init.cxx           |    4 ++++
 include/comphelper/threadpool.hxx     |    6 ++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

New commits:
commit 93e630a78330bb4b6076f8f638232dcc425f5b7c
Author: Michael Meeks <michael.meeks at collabora.com>
Date:   Fri Apr 13 23:11:13 2018 +0100

    Allow the comphelper threadpool to be reset after construction.
    
    Otherwise some pre-init components can start it, and threads get
    stranded in the forkit process causing grief.
    
    Change-Id: I104a38271662e9f8cc2fd128e7b758700fd3ca84
    Reviewed-on: https://gerrit.libreoffice.org/52859
    Reviewed-by: Jan Holesovsky <kendy at collabora.com>
    Tested-by: Jan Holesovsky <kendy at collabora.com>

diff --git a/comphelper/source/misc/threadpool.cxx b/comphelper/source/misc/threadpool.cxx
index 286fbf697358..a065c5f6606e 100644
--- a/comphelper/source/misc/threadpool.cxx
+++ b/comphelper/source/misc/threadpool.cxx
@@ -134,12 +134,21 @@ ThreadPool::ThreadPool( sal_Int32 nWorkers ) :
     mnThreadsWorking( 0 ),
     mbTerminate( false )
 {
+    launchWorkers( nWorkers );
+}
+
+void ThreadPool::launchWorkers( sal_Int32 nWorkers )
+{
+    osl::MutexGuard aGuard( maGuard );
+
+    mbTerminate = false;
+    mnThreadsWorking = 0;
+
     for( sal_Int32 i = 0; i < nWorkers; i++ )
         maWorkers.push_back( new ThreadWorker( this ) );
 
     maTasksComplete.set();
 
-    osl::MutexGuard aGuard( maGuard );
     for(rtl::Reference<ThreadWorker> & rpWorker : maWorkers)
         rpWorker->launch();
 }
@@ -160,7 +169,15 @@ struct ThreadPoolStatic : public rtl::StaticWithInit< std::shared_ptr< ThreadPoo
 
 ThreadPool& ThreadPool::getSharedOptimalPool()
 {
-    return *ThreadPoolStatic::get().get();
+    ThreadPool *pPool = ThreadPoolStatic::get().get();
+    if (pPool->maWorkers.size() <= 0)
+        pPool->launchWorkers( ThreadPool::getPreferredConcurrency() );
+    return *pPool;
+}
+
+void ThreadPool::resetSharedOptimalPool()
+{
+    ThreadPoolStatic::get()->waitAndCleanupWorkers();
 }
 
 sal_Int32 ThreadPool::getPreferredConcurrency()
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 81700d548e26..f550958ab4f1 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -35,6 +35,7 @@
 #include <comphelper/string.hxx>
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/scopeguard.hxx>
+#include <comphelper/threadpool.hxx>
 
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/container/XNameAccess.hpp>
@@ -3816,7 +3817,10 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char
     }
 
     if (eStage == PRE_INIT)
+    {
+        comphelper::ThreadPool::resetSharedOptimalPool();
         rtl_alloc_preInit(sal_False);
+    }
 
     return bInitialized;
 }
diff --git a/include/comphelper/threadpool.hxx b/include/comphelper/threadpool.hxx
index 7910a83ceeb7..d45e4fb89aaa 100644
--- a/include/comphelper/threadpool.hxx
+++ b/include/comphelper/threadpool.hxx
@@ -43,6 +43,9 @@ public:
     /// count for the CPU
     static      ThreadPool& getSharedOptimalPool();
 
+    /// resets / closes shared optimal pool workers.
+    static      void resetSharedOptimalPool();
+
     static std::shared_ptr<ThreadTaskTag> createThreadTaskTag();
 
     static bool isTaskTagDone(const std::shared_ptr<ThreadTaskTag>&);
@@ -56,6 +59,9 @@ public:
     ThreadPool( sal_Int32 nWorkers );
     ~ThreadPool();
 
+    /// Instantiate a given number of workers
+    void        launchWorkers( sal_Int32 nWorkers );
+
     /// push a new task onto the work queue
     void        pushTask( ThreadTask *pTask /* takes ownership */ );
 


More information about the Libreoffice-commits mailing list