version 1.35.2.2, 2006/07/28 20:50:01
|
version 1.36, 2006/08/02 20:20:18
|
|
|
#include "CMPI_Version.h" | #include "CMPI_Version.h" |
| |
#include <Pegasus/Common/Constants.h> | #include <Pegasus/Common/Constants.h> |
#include <Pegasus/Common/Time.h> |
|
#include <Pegasus/Common/Tracer.h> | #include <Pegasus/Common/Tracer.h> |
#include <Pegasus/Common/PegasusVersion.h> | #include <Pegasus/Common/PegasusVersion.h> |
| |
|
|
Semaphore CMPILocalProviderManager::_pollingSem(0); | Semaphore CMPILocalProviderManager::_pollingSem(0); |
AtomicInt CMPILocalProviderManager::_stopPolling(0); | AtomicInt CMPILocalProviderManager::_stopPolling(0); |
Thread *CMPILocalProviderManager::_reaperThread = 0; | Thread *CMPILocalProviderManager::_reaperThread = 0; |
List<CMPILocalProviderManager::cleanupThreadRecord,Mutex> CMPILocalProviderManager::_finishedThreadList; |
List<CMPILocalProviderManager::cleanupThreadRecord,RecursiveMutex> CMPILocalProviderManager::_finishedThreadList; |
Mutex CMPILocalProviderManager::_reaperMutex; |
Mutex CMPILocalProviderManager::_reaperMutex(0); |
| |
CMPILocalProviderManager::CMPILocalProviderManager (void): | CMPILocalProviderManager::CMPILocalProviderManager (void): |
_idle_timeout (IDLE_LIMIT) | _idle_timeout (IDLE_LIMIT) |
|
|
try | try |
{ | { |
struct timeval now; | struct timeval now; |
Time::gettimeofday (&now); |
gettimeofday (&now, NULL); |
ProviderTable::Iterator i = myself->_providers.start (); | ProviderTable::Iterator i = myself->_providers.start (); |
| |
for (; i != 0; i++) | for (; i != 0; i++) |
|
|
* The reaper function polls out the threads from the global list (_finishedThreadList), | * The reaper function polls out the threads from the global list (_finishedThreadList), |
* joins them deletes them, and removes them from the CMPIProvider specific list. | * joins them deletes them, and removes them from the CMPIProvider specific list. |
*/ | */ |
ThreadReturnType PEGASUS_THREAD_CDECL CMPILocalProviderManager::_reaper(void *parm) |
PEGASUS_THREAD_RETURN PEGASUS_THREAD_CDECL CMPILocalProviderManager::_reaper(void *parm) |
{ | { |
Thread *myself = reinterpret_cast<Thread *>(parm); | Thread *myself = reinterpret_cast<Thread *>(parm); |
do { | do { |
|
|
} | } |
} | } |
while (_stopPolling.get() == 0); | while (_stopPolling.get() == 0); |
myself->exit_self( (ThreadReturnType) 0); |
myself->exit_self( (PEGASUS_THREAD_RETURN) 0); |
return (0); | return (0); |
} | } |
/* | /* |
|
|
while ( (rtn = _reaperThread->run()) != PEGASUS_THREAD_OK) | while ( (rtn = _reaperThread->run()) != PEGASUS_THREAD_OK) |
{ | { |
if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES) | if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES) |
Threads::yield(); |
pegasus_yield(); |
else | else |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, \ | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, \ |
|
|
PEG_METHOD_ENTER (TRC_PROVIDERMANAGER, "ProviderManager::getProvider"); | PEG_METHOD_ENTER (TRC_PROVIDERMANAGER, "ProviderManager::getProvider"); |
if (fileName.size() == 0) | if (fileName.size() == 0) |
{ | { |
throw Exception(MessageLoaderParms("ProviderManager.CMPI.CMPILocalProviderManager.CANNOT_FIND_LIBRARY", |
throw Exception(MessageLoaderParms( |
"Provider library $0 was not found.", |
"ProviderManager.CMPI.CMPILocalProviderManager.CANNOT_FIND_LIBRARY", |
fileName)); |
"For provider $0 the library name was empty. Check provider registered location.", |
|
providerName)); |
| |
} | } |
lproviderName.append (providerName); | lproviderName.append (providerName); |
|
|
| |
if (first.tv_sec == 0) | if (first.tv_sec == 0) |
{ | { |
Time::gettimeofday (&first); |
gettimeofday (&first, NULL); |
} | } |
Time::gettimeofday (&now); |
gettimeofday (&now, NULL); |
| |
if (((now.tv_sec - first.tv_sec) > IDLE_LIMIT) && | if (((now.tv_sec - first.tv_sec) > IDLE_LIMIT) && |
((now.tv_sec - last.tv_sec) > IDLE_LIMIT)) | ((now.tv_sec - last.tv_sec) > IDLE_LIMIT)) |
{ | { |
Time::gettimeofday (&last); |
gettimeofday (&last, NULL); |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Checking for Idle providers to unload."); | "Checking for Idle providers to unload."); |
try | try |