24 #include <osl/diagnose.h>
28 #include <com/sun/star/util/XJobManager.hpp>
40 mrThreadJoiner( rThreadJoiner ),
42 mnThreadIDCounter( 0 ),
43 maWaitingForStartThreads(),
45 maStartNewThreadIdle(
"SW ThreadManager StartNewThreadIdle"),
46 mbStartingOfThreadsSuspended( false )
78 osl::MutexGuard aGuard(
maMutex);
89 aThreadData.
pThread->setPriority( osl_Thread_PriorityBelowNormal );
120 const bool bThreadFinished )
123 osl::MutexGuard aGuard(
maMutex);
125 std::deque< tThreadData >::iterator aIter =
135 if ( bThreadFinished )
138 css::uno::Reference< css::util::XJobManager > rThreadJoiner(
mrThreadJoiner );
139 if ( rThreadJoiner.is() )
141 rThreadJoiner->releaseJob( aTmpThreadData.
aJob );
145 OSL_FAIL(
"<ThreadManager::RemoveThread(..)> - ThreadJoiner already gone!" );
150 TryToStartNewThread(
nullptr );
181 bool bThreadStarted(
false );
183 if ( rThreadData.
pThread->create() )
186 bThreadStarted =
true;
191 css::uno::Reference< css::util::XJobManager > rThreadJoiner(
mrThreadJoiner );
192 if ( rThreadJoiner.is() )
194 rThreadJoiner->registerJob( rThreadData.
aJob );
198 OSL_FAIL(
"<ThreadManager::StartThread(..)> - ThreadJoiner already gone!" );
207 return bThreadStarted;
212 osl::MutexGuard aGuard(
maMutex);
214 if ( StartingOfThreadsSuspended() )
218 if ( !StartWaitingThread() )
223 if ( maStartedThreads.empty() && !maWaitingForStartThreads.empty() )
225 maStartNewThreadIdle.Start();
232 osl::MutexGuard aGuard(
maMutex);
#define LINK(Instance, Class, Member)
void Init()
initialization
ThreadManager(css::uno::Reference< css::util::XJobManager > const &rThreadJoiner)
css::uno::Reference< css::util::XCancellable > aJob
void RemoveThread(const oslInterlockedCount nThreadID, const bool bThreadFinished=false)
std::shared_ptr< ThreadListener > mpThreadListener
oslInterlockedCount mnThreadIDCounter
bool StartWaitingThread()
void ResumeStartingOfThreads()
continues the starting of threads after it has been suspended
IMPL_LINK_NOARG(ThreadManager, TryToStartNewThread, Timer *, void)
oslInterlockedCount AddThread(const ::rtl::Reference< ObservableThread > &rThread)
add thread to the thread manager and taking ownership for the thread
bool StartThread(const tThreadData &aThreadData)
virtual void Start() override
std::deque< tThreadData > maWaitingForStartThreads
std::weak_ptr< IFinishedThreadListener > GetThreadListenerWeakRef() const
bool StartingOfThreadsSuspended()
std::deque< tThreadData > maStartedThreads
bool mbStartingOfThreadsSuspended
css::uno::WeakReference< css::util::XJobManager > mrThreadJoiner
oslInterlockedCount nThreadID
Idle maStartNewThreadIdle
void SetInvokeHandler(const Link< Timer *, void > &rLink)
static const std::deque< tThreadData >::size_type snStartedSize
class to manage threads
void SetPriority(TaskPriority ePriority)
::rtl::Reference< ObservableThread > pThread
void NotifyAboutFinishedThread(const oslInterlockedCount nThreadID)