version 1.42, 2006/09/29 19:27:32
|
version 1.42.18.4, 2007/12/19 14:58:31
|
|
|
//============================================================================== | //============================================================================== |
// | // |
//%///////////////////////////////////////////////////////////////////////////// | //%///////////////////////////////////////////////////////////////////////////// |
|
// NOCHKSRC |
#include "CMPI_Version.h" | #include "CMPI_Version.h" |
| |
#include <Pegasus/Common/Constants.h> | #include <Pegasus/Common/Constants.h> |
|
|
| |
extern int _cmpi_trace; | extern int _cmpi_trace; |
| |
#undef IDLE_LIMIT |
|
#define IDLE_LIMIT 50 |
|
|
|
/* Thread deletion specific */ | /* Thread deletion specific */ |
Semaphore CMPILocalProviderManager::_pollingSem(0); | Semaphore CMPILocalProviderManager::_pollingSem(0); |
AtomicInt CMPILocalProviderManager::_stopPolling(0); | AtomicInt CMPILocalProviderManager::_stopPolling(0); |
|
|
Mutex CMPILocalProviderManager::_reaperMutex; | Mutex CMPILocalProviderManager::_reaperMutex; |
| |
CMPILocalProviderManager::CMPILocalProviderManager (void): | CMPILocalProviderManager::CMPILocalProviderManager (void): |
_idle_timeout (IDLE_LIMIT) |
_idle_timeout (PEGASUS_PROVIDER_IDLE_TIMEOUT_SECONDS) |
{ | { |
} | } |
| |
|
|
case GET_PROVIDER: | case GET_PROVIDER: |
{ | { |
| |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::GET_PROVIDER"); | "_provider_ctrl::GET_PROVIDER"); |
| |
String providerName = *(parms->providerName); | String providerName = *(parms->providerName); |
|
|
case UNLOAD_PROVIDER: | case UNLOAD_PROVIDER: |
{ | { |
| |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::UNLOAD_PROVIDER"); | "_provider_ctrl::UNLOAD_PROVIDER"); |
CMPIProvider *pr = 0; | CMPIProvider *pr = 0; |
pr = _lookupProvider (*(parms->providerName)); | pr = _lookupProvider (*(parms->providerName)); |
|
|
case LOOKUP_PROVIDER: | case LOOKUP_PROVIDER: |
{ | { |
| |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::LOOKUP_PROVIDER"); | "_provider_ctrl::LOOKUP_PROVIDER"); |
| |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
|
|
case LOOKUP_MODULE: | case LOOKUP_MODULE: |
{ | { |
| |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::LOOKUP_MODULE"); | "_provider_ctrl::LOOKUP_MODULE"); |
| |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
|
|
case INSERT_PROVIDER: | case INSERT_PROVIDER: |
{ | { |
| |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::INSERT_PROVIDER"); | "_provider_ctrl::INSERT_PROVIDER"); |
| |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
|
|
} | } |
case INSERT_MODULE: | case INSERT_MODULE: |
{ | { |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::INSERT_MODULE"); | "_provider_ctrl::INSERT_MODULE"); |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
if (false == _modules.insert (*(parms->fileName), | if (false == _modules.insert (*(parms->fileName), |
|
|
| |
case UNLOAD_ALL_PROVIDERS: | case UNLOAD_ALL_PROVIDERS: |
{ | { |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::UNLOAD_ALL_PROVIDERS"); | "_provider_ctrl::UNLOAD_ALL_PROVIDERS"); |
CMPILocalProviderManager *myself = | CMPILocalProviderManager *myself = |
reinterpret_cast < CMPILocalProviderManager * >(parm); | reinterpret_cast < CMPILocalProviderManager * >(parm); |
|
|
// Locked provider mutex. | // Locked provider mutex. |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
| |
Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"providers in cache = %d", myself->_providers.size ()); |
"providers in cache = %d", myself->_providers.size ())); |
ProviderTable::Iterator i = myself->_providers.start (); | ProviderTable::Iterator i = myself->_providers.start (); |
try | try |
{ | { |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Unexpected Exception in UNLOAD_ALL_PROVIDERS."); | "Unexpected Exception in UNLOAD_ALL_PROVIDERS."); |
} | } |
break; | break; |
} | } |
case UNLOAD_IDLE_PROVIDERS: | case UNLOAD_IDLE_PROVIDERS: |
{ | { |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"_provider_ctrl::UNLOAD_IDLE_PROVIDERS"); | "_provider_ctrl::UNLOAD_IDLE_PROVIDERS"); |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
| |
|
|
// candidates above. | // candidates above. |
for (Uint32 index = 0; index < upaIndex; index++) | for (Uint32 index = 0; index < upaIndex; index++) |
{ | { |
|
CMPIProvider *provider = unloadProviderArray[index]; |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Now trying to unload CMPIProvider " + | "Now trying to unload CMPIProvider " + |
provider->getName ()); | provider->getName ()); |
CMPIProvider *provider = unloadProviderArray[index]; |
|
|
|
{ | { |
// lock the provider mutex | // lock the provider mutex |
| |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Unexpected Exception in UNLOAD_IDLE_PROVIDERS."); | "Unexpected Exception in UNLOAD_IDLE_PROVIDERS."); |
} | } |
delete [] unloadProviderArray; | delete [] unloadProviderArray; |
|
|
Threads::yield(); | Threads::yield(); |
else | else |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, \ |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, \ |
"Could not allocate thread to take care of deleting user threads. "); | "Could not allocate thread to take care of deleting user threads. "); |
delete _reaperThread; _reaperThread = 0; | delete _reaperThread; _reaperThread = 0; |
return; | return; |
} | } |
} | } |
}/* |
} |
Tracer::trace(TRC_PROVIDERMANAGER, Tracer::LEVEL2, \ |
|
"Cleaning up provider thread (%p) from provider %s.", |
|
t, (const char *)p->getName().getCString());*/ |
|
// Wake up the reaper. | // Wake up the reaper. |
_pollingSem.signal(); | _pollingSem.signal(); |
| |
|
|
try | try |
{ | { |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"providers in _providers table = %d", _providers.size ()); |
"providers in _providers table = %d", _providers.size ())); |
| |
// Iterate through the _providers table looking for an active provider | // Iterate through the _providers table looking for an active provider |
for (ProviderTable::Iterator i = _providers.start (); i != 0; i++) | for (ProviderTable::Iterator i = _providers.start (); i != 0; i++) |
|
|
catch (...) | catch (...) |
{ | { |
// Unexpected exception; do not assume that no providers are loaded | // Unexpected exception; do not assume that no providers are loaded |
PEG_TRACE_STRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Unexpected Exception in hasActiveProviders."); | "Unexpected Exception in hasActiveProviders."); |
PEG_METHOD_EXIT (); | PEG_METHOD_EXIT (); |
return true; | return true; |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Caught unexpected exception from UNLOAD_IDLE_PROVIDERS."); | "Caught unexpected exception from UNLOAD_IDLE_PROVIDERS."); |
} | } |
| |
|
|
| |
Array < CMPIProvider * >enableProviders; | Array < CMPIProvider * >enableProviders; |
| |
Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Number of providers in _providers table = %d", | "Number of providers in _providers table = %d", |
_providers.size ()); |
_providers.size ())); |
| |
try | try |
{ | { |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2, |
PEG_TRACE_CSTRING (TRC_DISCARDED_DATA, Tracer::LEVEL2, |
"Unexpected error in getIndicationProvidersToEnable"); | "Unexpected error in getIndicationProvidersToEnable"); |
} | } |
| |
Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Number of indication providers to enable = %d", | "Number of indication providers to enable = %d", |
enableProviders.size ()); |
enableProviders.size ())); |
| |
PEG_METHOD_EXIT (); | PEG_METHOD_EXIT (); |
return enableProviders; | return enableProviders; |
|
|
be outside the scope for the AutoMutex for the provider. */ | be outside the scope for the AutoMutex for the provider. */ |
if (deleteProvider) | if (deleteProvider) |
{ | { |
// delete the cimom handle |
// Note: The deleting of the cimom handle is being |
delete provider->_cimom_handle; |
// moved after the call to unloadModule() based on |
// set provider status to UNINITIALIZED |
// a previous fix for bug 3669 and consistency with |
provider->reset (); |
// other provider managers. Do not move it back before |
|
// the call to unloadModule(). |
| |
// unload provider module | // unload provider module |
if (moduleLoaded) | if (moduleLoaded) |
|
|
module->unloadModule(); | module->unloadModule(); |
} | } |
| |
|
// delete the cimom handle |
|
delete provider->_cimom_handle; |
|
// set provider status to UNINITIALIZED |
|
provider->reset (); |
|
|
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
_providers.remove (provider->_name); | _providers.remove (provider->_name); |
delete provider; | delete provider; |