version 1.62, 2008/12/16 18:56:54
|
version 1.62.2.1, 2009/03/24 13:47:36
|
|
|
CMPIProvider *provider = 0; | CMPIProvider *provider = 0; |
// Locked provider mutex. | // Locked provider mutex. |
AutoMutex lock (_providerTableMutex); | AutoMutex lock (_providerTableMutex); |
Array<CMPIProvider*> unloadPendingProviders; |
|
| |
PEG_TRACE(( | PEG_TRACE(( |
TRC_PROVIDERMANAGER, | TRC_PROVIDERMANAGER, |
|
|
} | } |
else | else |
{ | { |
_unloadProvider (provider); |
// Force unload. |
|
_unloadProvider (provider, true); |
if (provider->getStatus () == | if (provider->getStatus () == |
CMPIProvider::UNINITIALIZED) | CMPIProvider::UNINITIALIZED) |
{ | { |
delete provider; | delete provider; |
} | } |
else |
|
{ |
|
unloadPendingProviders.append(provider); |
|
} |
|
} | } |
} | } |
| |
if (unloadPendingProviders.size()) |
|
{ |
|
_terminateUnloadPendingProviders( |
|
unloadPendingProviders); |
|
} |
|
// All the providers are removed. Clear the hash-table | // All the providers are removed. Clear the hash-table |
_providers.clear (); | _providers.clear (); |
} | } |
|
|
return(provider); | return(provider); |
} | } |
| |
/* |
|
This method is called when CMPIProviderManager receives |
|
CIMStopAllProvidersRequestMessage and |
|
CMPILocalProviderManager::_provider_ctrl() method could not unload the |
|
provider(s) because of pending requests with the provider. We give grace |
|
time of (shutdownTimeout - 1) seconds to the unload pending providers |
|
to unload gracefully before terminating them forcibly. Note that this |
|
happens only when provider is running out-of-process and communication |
|
with CIMServer falied because of pipe read/write failures. |
|
*/ |
|
void CMPILocalProviderManager::_terminateUnloadPendingProviders( |
|
Array<CMPIProvider*> &unloadPendingProviders) |
|
{ |
|
PEG_METHOD_ENTER( |
|
TRC_PROVIDERMANAGER, |
|
"CMPILocalProviderManager::_terminateUnloadPendingProviders()"); |
|
|
|
PEG_TRACE(( |
|
TRC_PROVIDERMANAGER, |
|
Tracer::LEVEL3, |
|
"Unloading %u unload-pending providers.", |
|
unloadPendingProviders.size())); |
|
|
|
String configTimeout = |
|
ConfigManager::getInstance()->getCurrentValue("shutdownTimeout"); |
|
|
|
Uint32 timeoutValue = |
|
strtol(configTimeout.getCString(), (char **)0, 10); |
|
|
|
for (Uint32 waitTime = timeoutValue - 1; waitTime > 0; waitTime--) |
|
{ |
|
Boolean unloadPending = false; |
|
for (Uint32 j = 0, n = unloadPendingProviders.size(); j < n; ++j) |
|
{ |
|
if (unloadPendingProviders[j]->getStatus() == |
|
CMPIProvider::INITIALIZED) |
|
{ |
|
_unloadProvider(unloadPendingProviders[j]); |
|
if (unloadPendingProviders[j]->getStatus() |
|
== CMPIProvider::INITIALIZED) |
|
{ |
|
unloadPending = true; |
|
} |
|
} |
|
} |
|
if (!unloadPending) |
|
{ |
|
break; |
|
} |
|
Threads::sleep(1000); |
|
} |
|
|
|
for (Uint32 j = 0, n = unloadPendingProviders.size(); j < n; ++j) |
|
{ |
|
if (unloadPendingProviders[j]->getStatus() == |
|
CMPIProvider::INITIALIZED) |
|
{ |
|
// Force unload |
|
_unloadProvider(unloadPendingProviders[j], true); |
|
} |
|
if (unloadPendingProviders[j]->getStatus() == |
|
CMPIProvider::UNINITIALIZED) |
|
{ |
|
delete unloadPendingProviders[j]; |
|
} |
|
} |
|
|
|
PEG_METHOD_EXIT(); |
|
} |
|
|
|
void CMPILocalProviderManager::_unloadProvider ( | void CMPILocalProviderManager::_unloadProvider ( |
CMPIProvider * provider, | CMPIProvider * provider, |
Boolean forceUnload) | Boolean forceUnload) |