diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2014-11-14 16:05:37 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2014-11-14 16:19:40 +0100 |
commit | b021fdfab3a0985ba1f5380f378bf8ab97383aed (patch) | |
tree | e9c69dd093e2cc7cb335261851e43eec4a7371f5 /cppu/source/threadpool/thread.cxx | |
parent | 9dacd849b6ba76bab36558ad9e5d5614cd9fa29e (diff) |
cid#983623 Don't throw DisposedException past uno_threadpool_putJob
This improves on b68640c44ecdb1df59d704cc6c2bae8bb412d7d0 "Prevent creation of
new ORequestThreads during shutdown," which added throwing the DisposedException
from ThreadAdmin::add. But ThreadAdmin::m_disposed can only become true via
uno_threadpool_destroy -> ThreadPool::joinWorkers -> ThreadAdmin::join, and
ThreadAdmin::add observing that can only happen via uno_threadpool_putJob ->
ThreadPool::addJob -> ThreadPool::createThread -> ORequestThread::launch ->
ThradAdmin::add, where the bridges should ensure that uno_threadpool_destroy
does not run in parallel with uno_threadpool_putJob. So demote this from a
DisposedException to a SAL_WARN.
Change-Id: I3912ea077b7fa35827c41e82dd0a8f962ba412b6
Diffstat (limited to 'cppu/source/threadpool/thread.cxx')
-rw-r--r-- | cppu/source/threadpool/thread.cxx | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/cppu/source/threadpool/thread.cxx b/cppu/source/threadpool/thread.cxx index aed132243b5d..724da750708e 100644 --- a/cppu/source/threadpool/thread.cxx +++ b/cppu/source/threadpool/thread.cxx @@ -21,12 +21,6 @@ #include <osl/diagnose.h> #include <uno/threadpool.h> -#include <com/sun/star/lang/DisposedException.hpp> -#include <com/sun/star/uno/Reference.hxx> -#include <com/sun/star/uno/XInterface.hpp> -#include <rtl/ustring.h> -#include <rtl/ustring.hxx> - #include "thread.hxx" #include "jobqueue.hxx" #include "threadpool.hxx" @@ -49,16 +43,15 @@ namespace cppu_threadpool { #endif } - void ThreadAdmin::add( rtl::Reference< ORequestThread > const & p ) + bool ThreadAdmin::add( rtl::Reference< ORequestThread > const & p ) { MutexGuard aGuard( m_mutex ); if( m_disposed ) { - throw css::lang::DisposedException( - "cppu_threadpool::ORequestThread created after" - " cppu_threadpool::ThreadAdmin has been disposed"); + return false; } m_lst.push_back( p ); + return true; } void ThreadAdmin::remove_locked( rtl::Reference< ORequestThread > const & p ) @@ -120,14 +113,16 @@ namespace cppu_threadpool { m_bAsynchron = bAsynchron; } - void ORequestThread::launch() + bool ORequestThread::launch() { // Assumption is that osl::Thread::create returns normally with a true // return value iff it causes osl::Thread::run to start executing: acquire(); ThreadAdmin & rThreadAdmin = m_aThreadPool->getThreadAdmin(); osl::ClearableMutexGuard g(rThreadAdmin.m_mutex); - rThreadAdmin.add( this ); + if (!rThreadAdmin.add( this )) { + return false; + } try { if (!create()) { throw std::runtime_error("osl::Thread::create failed"); @@ -138,6 +133,7 @@ namespace cppu_threadpool { release(); throw; } + return true; } void ORequestThread::onTerminated() |