Kaydet (Commit) b68640c4 authored tarafından Stephan Bergmann's avatar Stephan Bergmann

Prevent creation of new ORequestThreads during shutdown.

üst 71b63586
...@@ -30,12 +30,22 @@ ...@@ -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 ) ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment