version 1.14, 2007/06/05 08:16:41
|
version 1.15, 2008/06/19 17:57:01
|
|
|
// Set the dying flag so all thread know the destructor has been | // Set the dying flag so all thread know the destructor has been |
// entered | // entered |
_dying++; | _dying++; |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL2, |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL3, |
"Cleaning up %d idle threads.", _currentThreads.get())); | "Cleaning up %d idle threads.", _currentThreads.get())); |
| |
while (_currentThreads.get() > 0) | while (_currentThreads.get() > 0) |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_loop: Failure getting sleep_sem or " | "ThreadPool::_loop: Failure getting sleep_sem or " |
"lastActivityTime."); | "lastActivityTime."); |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_loop: failure on sleep_sem->wait()."); | "ThreadPool::_loop: failure on sleep_sem->wait()."); |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
pool->_idleThreads.remove(myself); | pool->_idleThreads.remove(myself); |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_loop: Failure accessing work func, work " | "ThreadPool::_loop: Failure accessing work func, work " |
"parm, or blocking sem."); | "parm, or blocking sem."); |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
|
|
} | } |
catch (Exception& e) | catch (Exception& e) |
{ | { |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
String("Exception from work in ThreadPool::_loop: ") + | String("Exception from work in ThreadPool::_loop: ") + |
e.getMessage()); | e.getMessage()); |
} | } |
catch (const exception& e) | catch (const exception& e) |
{ | { |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
String("Exception from work in ThreadPool::_loop: ") + | String("Exception from work in ThreadPool::_loop: ") + |
e.what()); | e.what()); |
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"Unknown exception from work in ThreadPool::_loop."); | "Unknown exception from work in ThreadPool::_loop."); |
} | } |
| |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_loop: Adding thread to idle pool failed."); | "ThreadPool::_loop: Adding thread to idle pool failed."); |
PEGASUS_ASSERT(false); | PEGASUS_ASSERT(false); |
pool->_currentThreads--; | pool->_currentThreads--; |
|
|
} | } |
catch (const Exception & e) | catch (const Exception & e) |
{ | { |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"Caught exception: \"" + e.getMessage() + "\". Exiting _loop."); | "Caught exception: \"" + e.getMessage() + "\". Exiting _loop."); |
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"Caught unrecognized exception. Exiting _loop."); | "Caught unrecognized exception. Exiting _loop."); |
} | } |
| |
|
|
{ | { |
if (_dying.get()) | if (_dying.get()) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL3, |
"ThreadPool::allocate_and_awaken: ThreadPool is dying(1)."); | "ThreadPool::allocate_and_awaken: ThreadPool is dying(1)."); |
return PEGASUS_THREAD_UNAVAILABLE; | return PEGASUS_THREAD_UNAVAILABLE; |
} | } |
|
|
| |
if (th == 0) | if (th == 0) |
{ | { |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL2, |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL1, |
"ThreadPool::allocate_and_awaken: Insufficient resources: " | "ThreadPool::allocate_and_awaken: Insufficient resources: " |
" pool = %s, running threads = %d, idle threads = %d", | " pool = %s, running threads = %d, idle threads = %d", |
_key, _runningThreads.size(), _idleThreads.size())); | _key, _runningThreads.size(), _idleThreads.size())); |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::allocate_and_awaken: Operation Failed."); | "ThreadPool::allocate_and_awaken: Operation Failed."); |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
// ATTN: Error result has not yet been defined | // ATTN: Error result has not yet been defined |
|
|
| |
if (th->run() != PEGASUS_THREAD_OK) | if (th->run() != PEGASUS_THREAD_OK) |
{ | { |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL2, |
PEG_TRACE((TRC_THREAD, Tracer::LEVEL1, |
"Could not create thread. Error code is %d.", errno)); | "Could not create thread. Error code is %d.", errno)); |
delete th; | delete th; |
return 0; | return 0; |
|
|
{ | { |
if (th == 0) | if (th == 0) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_addToIdleThreadsQueue: Thread pointer is null."); | "ThreadPool::_addToIdleThreadsQueue: Thread pointer is null."); |
throw NullPointer(); | throw NullPointer(); |
} | } |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_DISCARDED_DATA, Tracer::LEVEL1, |
"ThreadPool::_addToIdleThreadsQueue: _idleThreads.insert_front " | "ThreadPool::_addToIdleThreadsQueue: _idleThreads.insert_front " |
"failed."); | "failed."); |
} | } |