summaryrefslogtreecommitdiff
path: root/cppu
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2011-12-19 15:15:28 +0100
committerStephan Bergmann <sbergman@redhat.com>2011-12-19 16:08:20 +0100
commitb68640c44ecdb1df59d704cc6c2bae8bb412d7d0 (patch)
tree43f9196d9f3c87d9608ef2024ee477e43d5b5732 /cppu
parent71b63586c5fe33fdf836ecb417d11f9c2d4e4b72 (diff)
Prevent creation of new ORequestThreads during shutdown.
Diffstat (limited to 'cppu')
-rw-r--r--cppu/source/threadpool/thread.cxx25
-rw-r--r--cppu/source/threadpool/thread.hxx2
2 files changed, 27 insertions, 0 deletions
diff --git a/cppu/source/threadpool/thread.cxx b/cppu/source/threadpool/thread.cxx
index 58aec56cf185..cc22a453c79d 100644
--- a/cppu/source/threadpool/thread.cxx
+++ b/cppu/source/threadpool/thread.cxx
@@ -30,12 +30,22 @@
#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/instance.hxx>
+#include <rtl/ustring.h>
+#include <rtl/ustring.hxx>
#include "thread.hxx"
#include "jobqueue.hxx"
#include "threadpool.hxx"
+namespace {
+
+namespace css = com::sun::star;
+
+}
using namespace osl;
extern "C" {
@@ -53,6 +63,8 @@ void SAL_CALL cppu_requestThreadWorker( void *pVoid )
namespace cppu_threadpool {
// ----------------------------------------------------------------------------------
+ ThreadAdmin::ThreadAdmin(): m_disposed(false) {}
+
ThreadAdmin::~ThreadAdmin()
{
#if OSL_DEBUG_LEVEL > 1
@@ -66,6 +78,15 @@ namespace cppu_threadpool {
void ThreadAdmin::add( ORequestThread *p )
{
MutexGuard aGuard( m_mutex );
+ if( m_disposed )
+ {
+ throw css::lang::DisposedException(
+ rtl::OUString(
+ RTL_CONSTASCII_USTRINGPARAM(
+ "cppu_threadpool::ORequestThread created after"
+ " cppu_threadpool::ThreadAdmin has been disposed")),
+ css::uno::Reference< css::uno::XInterface >());
+ }
m_lst.push_back( p );
}
@@ -79,6 +100,10 @@ namespace cppu_threadpool {
void ThreadAdmin::join()
{
+ {
+ MutexGuard aGuard( m_mutex );
+ m_disposed = true;
+ }
ORequestThread *pCurrent;
do
{
diff --git a/cppu/source/threadpool/thread.hxx b/cppu/source/threadpool/thread.hxx
index bbef51eabca4..a3ea45aadaed 100644
--- a/cppu/source/threadpool/thread.hxx
+++ b/cppu/source/threadpool/thread.hxx
@@ -74,6 +74,7 @@ namespace cppu_threadpool {
class ThreadAdmin
{
public:
+ ThreadAdmin();
~ThreadAdmin ();
static ThreadAdminHolder &getInstance();
void add( ORequestThread * );
@@ -83,6 +84,7 @@ namespace cppu_threadpool {
private:
::osl::Mutex m_mutex;
::std::list< ORequestThread * > m_lst;
+ bool m_disposed;
};
} // end cppu_threadpool