summaryrefslogtreecommitdiff
path: root/cppu/source/threadpool/thread.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2014-11-14 16:05:37 +0100
committerStephan Bergmann <sbergman@redhat.com>2014-11-14 16:19:40 +0100
commitb021fdfab3a0985ba1f5380f378bf8ab97383aed (patch)
treee9c69dd093e2cc7cb335261851e43eec4a7371f5 /cppu/source/threadpool/thread.cxx
parent9dacd849b6ba76bab36558ad9e5d5614cd9fa29e (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.cxx20
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()