diff options
author | Noel Grandin <noel@peralex.com> | 2016-07-08 14:29:53 +0200 |
---|---|---|
committer | Noel Grandin <noelgrandin@gmail.com> | 2016-07-18 06:49:09 +0000 |
commit | 76ad32bec8e2c00c21247041b16d9e09e73d2504 (patch) | |
tree | 7b2b1277151bc7904ff63684ebd7e3d6d8a7d661 /package | |
parent | 9bf9f88e4c7e0b182ec6d8b4aefb7d735bb0653b (diff) |
add tagging to ThreadTasks so we don't need more one pool
If more than one place in the code submits tasks to the shared
pool, then waitTillDone() becomes unreliable.
Add a tagging mechanism, so different callsites can wait
on different sets of tasks.
Also try to protect our worker threads against exceptions from
the thread tasks code.
Change-Id: Idde664ab50008d31a2dd73910bb22f50e62ae22f
Reviewed-on: https://gerrit.libreoffice.org/27042
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
Diffstat (limited to 'package')
-rw-r--r-- | package/inc/ZipOutputStream.hxx | 4 | ||||
-rw-r--r-- | package/source/zipapi/ZipOutputStream.cxx | 6 | ||||
-rw-r--r-- | package/source/zippackage/ZipPackageStream.cxx | 7 |
3 files changed, 10 insertions, 7 deletions
diff --git a/package/inc/ZipOutputStream.hxx b/package/inc/ZipOutputStream.hxx index 136bc72b249d..1fc41661d186 100644 --- a/package/inc/ZipOutputStream.hxx +++ b/package/inc/ZipOutputStream.hxx @@ -35,10 +35,10 @@ class ZipOutputStream { css::uno::Reference< css::io::XOutputStream > m_xStream; ::std::vector < ZipEntry * > m_aZipList; + std::shared_ptr<comphelper::ThreadTaskTag> mpThreadTaskTag; ByteChucker m_aChucker; ZipEntry *m_pCurrentEntry; - comphelper::ThreadPool &m_rSharedThreadPool; std::vector< ZipOutputEntry* > m_aEntries; ::css::uno::Any m_aDeflateException; @@ -80,6 +80,8 @@ public: void reduceScheduledThreadsToGivenNumberOrLess( sal_Int32 nThreads, sal_Int32 nWaitTimeInTenthSeconds); + + const std::shared_ptr<comphelper::ThreadTaskTag>& getThreadTaskTag() { return mpThreadTaskTag; } }; #endif diff --git a/package/source/zipapi/ZipOutputStream.cxx b/package/source/zipapi/ZipOutputStream.cxx index 41f78b414879..7e9ffe5bfc1a 100644 --- a/package/source/zipapi/ZipOutputStream.cxx +++ b/package/source/zipapi/ZipOutputStream.cxx @@ -42,9 +42,9 @@ using namespace com::sun::star::packages::zip::ZipConstants; */ ZipOutputStream::ZipOutputStream( const uno::Reference < io::XOutputStream > &xOStream ) : m_xStream(xOStream) +, mpThreadTaskTag( comphelper::ThreadPool::createThreadTaskTag() ) , m_aChucker(xOStream) , m_pCurrentEntry(nullptr) -, m_rSharedThreadPool(comphelper::ThreadPool::getSharedOptimalPool()) { } @@ -70,7 +70,7 @@ void ZipOutputStream::setEntry( ZipEntry *pEntry ) void ZipOutputStream::addDeflatingThread( ZipOutputEntry *pEntry, comphelper::ThreadTask *pThread ) { - m_rSharedThreadPool.pushTask(pThread); + comphelper::ThreadPool::getSharedOptimalPool().pushTask(pThread); m_aEntries.push_back(pEntry); } @@ -178,7 +178,7 @@ void ZipOutputStream::finish() assert(!m_aZipList.empty() && "Zip file must have at least one entry!"); // Wait for all threads to finish & write - m_rSharedThreadPool.waitUntilEmpty(); + comphelper::ThreadPool::getSharedOptimalPool().waitUntilDone(mpThreadTaskTag); // consume all processed entries consumeAllScheduledThreadEntries(); diff --git a/package/source/zippackage/ZipPackageStream.cxx b/package/source/zippackage/ZipPackageStream.cxx index 5efb145fd9f7..e72c3999c9f5 100644 --- a/package/source/zippackage/ZipPackageStream.cxx +++ b/package/source/zippackage/ZipPackageStream.cxx @@ -466,9 +466,10 @@ class DeflateThread: public comphelper::ThreadTask uno::Reference< io::XInputStream > mxInStream; public: - DeflateThread( ZipOutputEntry *pEntry, + DeflateThread( const std::shared_ptr<comphelper::ThreadTaskTag>& pTag, ZipOutputEntry *pEntry, const uno::Reference< io::XInputStream >& xInStream ) - : mpEntry(pEntry) + : comphelper::ThreadTask(pTag) + , mpEntry(pEntry) , mxInStream(xInStream) {} @@ -849,7 +850,7 @@ bool ZipPackageStream::saveChild( // Start a new thread deflating this zip entry ZipOutputEntry *pZipEntry = new ZipOutputEntry( m_xContext, *pTempEntry, this, bToBeEncrypted); - rZipOut.addDeflatingThread( pZipEntry, new DeflateThread(pZipEntry, xStream) ); + rZipOut.addDeflatingThread( pZipEntry, new DeflateThread(rZipOut.getThreadTaskTag(), pZipEntry, xStream) ); } else { |