Prevent creation of new ORequestThreads during shutdown.
This commit is contained in:
@@ -30,12 +30,22 @@
|
|||||||
#include <osl/diagnose.h>
|
#include <osl/diagnose.h>
|
||||||
#include <uno/threadpool.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/instance.hxx>
|
||||||
|
#include <rtl/ustring.h>
|
||||||
|
#include <rtl/ustring.hxx>
|
||||||
|
|
||||||
#include "thread.hxx"
|
#include "thread.hxx"
|
||||||
#include "jobqueue.hxx"
|
#include "jobqueue.hxx"
|
||||||
#include "threadpool.hxx"
|
#include "threadpool.hxx"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
namespace css = com::sun::star;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
using namespace osl;
|
using namespace osl;
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@@ -53,6 +63,8 @@ void SAL_CALL cppu_requestThreadWorker( void *pVoid )
|
|||||||
namespace cppu_threadpool {
|
namespace cppu_threadpool {
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------------
|
||||||
|
ThreadAdmin::ThreadAdmin(): m_disposed(false) {}
|
||||||
|
|
||||||
ThreadAdmin::~ThreadAdmin()
|
ThreadAdmin::~ThreadAdmin()
|
||||||
{
|
{
|
||||||
#if OSL_DEBUG_LEVEL > 1
|
#if OSL_DEBUG_LEVEL > 1
|
||||||
@@ -66,6 +78,15 @@ namespace cppu_threadpool {
|
|||||||
void ThreadAdmin::add( ORequestThread *p )
|
void ThreadAdmin::add( ORequestThread *p )
|
||||||
{
|
{
|
||||||
MutexGuard aGuard( m_mutex );
|
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 );
|
m_lst.push_back( p );
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +100,10 @@ namespace cppu_threadpool {
|
|||||||
|
|
||||||
void ThreadAdmin::join()
|
void ThreadAdmin::join()
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
MutexGuard aGuard( m_mutex );
|
||||||
|
m_disposed = true;
|
||||||
|
}
|
||||||
ORequestThread *pCurrent;
|
ORequestThread *pCurrent;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@@ -74,6 +74,7 @@ namespace cppu_threadpool {
|
|||||||
class ThreadAdmin
|
class ThreadAdmin
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
ThreadAdmin();
|
||||||
~ThreadAdmin ();
|
~ThreadAdmin ();
|
||||||
static ThreadAdminHolder &getInstance();
|
static ThreadAdminHolder &getInstance();
|
||||||
void add( ORequestThread * );
|
void add( ORequestThread * );
|
||||||
@@ -83,6 +84,7 @@ namespace cppu_threadpool {
|
|||||||
private:
|
private:
|
||||||
::osl::Mutex m_mutex;
|
::osl::Mutex m_mutex;
|
||||||
::std::list< ORequestThread * > m_lst;
|
::std::list< ORequestThread * > m_lst;
|
||||||
|
bool m_disposed;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end cppu_threadpool
|
} // end cppu_threadpool
|
||||||
|
Reference in New Issue
Block a user