1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
* Modification History
*
* 2004-November-9 Jason Rohrer
* Created.
* Modified from MUTE's ChannelReceivingThreadManager.
*
* 2005-January-9 Jason Rohrer
* Changed to sleep on a semaphore to allow sleep to be interrupted.
*/
#include "minorGems/system/FinishedSignalThreadManager.h"
FinishedSignalThreadManager::FinishedSignalThreadManager()
: mLock( new MutexLock() ),
mThreadVector( new SimpleVector<FinishedSignalThread *>() ),
mStopSignal( false ),
mSleepSemaphore( new BinarySemaphore() ) {
this->start();
}
FinishedSignalThreadManager::~FinishedSignalThreadManager() {
mLock->lock();
mStopSignal = true;
mLock->unlock();
// signal the sleeping semaphore to wake up the thread
mSleepSemaphore->signal();
this->join();
mLock->lock();
// destroy all remaining threads
int numThreads = mThreadVector->size();
for( int i=0; i<numThreads; i++ ) {
delete *( mThreadVector->getElement( i ) );
}
delete mThreadVector;
mLock->unlock();
delete mLock;
delete mSleepSemaphore;
}
void FinishedSignalThreadManager::addThread(
FinishedSignalThread *inThread ) {
mLock->lock();
mThreadVector->push_back( inThread );
mLock->unlock();
}
void FinishedSignalThreadManager::run() {
char stopped;
mLock->lock();
stopped = mStopSignal;
mLock->unlock();
while( !stopped ) {
// wait for 10 seconds
int wasSignaled = mSleepSemaphore->wait( 10000 );
if( wasSignaled == 1 ) {
// signaled... we should stop
return;
}
char foundFinished = true;
while( foundFinished ) {
foundFinished = false;
mLock->lock();
int numThreads = mThreadVector->size();
for( int i=0; i<numThreads && !foundFinished; i++ ) {
FinishedSignalThread *currentThread =
*( mThreadVector->getElement( i ) );
if( currentThread->isFinished() ) {
delete currentThread;
mThreadVector->deleteElement( i );
foundFinished = true;
}
}
mLock->unlock();
}
mLock->lock();
stopped = mStopSignal;
mLock->unlock();
}
}
|