version 1.76, 2006/10/10 18:27:09
|
version 1.84, 2008/05/12 09:14:55
|
|
|
#include <Pegasus/Common/StatisticalData.h> | #include <Pegasus/Common/StatisticalData.h> |
#include <Pegasus/Common/Logger.h> | #include <Pegasus/Common/Logger.h> |
#include <Pegasus/Common/MessageLoader.h> | #include <Pegasus/Common/MessageLoader.h> |
|
#include <Pegasus/Common/FileSystem.h> |
#include <Pegasus/Common/PegasusVersion.h> | #include <Pegasus/Common/PegasusVersion.h> |
#include <Pegasus/Common/Constants.h> | #include <Pegasus/Common/Constants.h> |
| |
|
|
case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: | case CIM_DELETE_SUBSCRIPTION_REQUEST_MESSAGE: |
case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: | case CIM_EXPORT_INDICATION_REQUEST_MESSAGE: |
{ | { |
|
ProviderIdContainer providerId = |
|
request->operationContext.get(ProviderIdContainer::NAME); |
|
|
// resolve provider name | // resolve provider name |
ProviderName name = _resolveProviderName( |
ProviderName name = _resolveProviderName(providerId); |
request->operationContext.get(ProviderIdContainer::NAME)); |
|
| |
// get cached or load new provider module | // get cached or load new provider module |
ProviderOperationCounter poc( | ProviderOperationCounter poc( |
_getProvider(name.getPhysicalName(), name.getLogicalName())); |
_getProvider( |
|
name.getPhysicalName(), |
|
name.getModuleName(), |
|
name.getLogicalName())); |
| |
response = poc.GetProvider().processMessage(request); | response = poc.GetProvider().processMessage(request); |
break; | break; |
|
|
response = _handleSubscriptionInitCompleteRequest(request); | response = _handleSubscriptionInitCompleteRequest(request); |
break; | break; |
| |
// Note: The PG_Provider AutoStart property is not yet supported |
|
#if 0 |
|
case CIM_INITIALIZE_PROVIDER_REQUEST_MESSAGE: |
|
{ |
|
// resolve provider name |
|
ProviderName name = _resolveProviderName( |
|
request->operationContext.get(ProviderIdContainer::NAME)); |
|
|
|
// get cached or load new provider module |
|
ProviderOperationCounter poc( |
|
_getProvider(name.getPhysicalName(), name.getLogicalName())); |
|
|
|
break; |
|
} |
|
#endif |
|
|
|
default: | default: |
PEGASUS_ASSERT(0); | PEGASUS_ASSERT(0); |
break; | break; |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Exception: Unknown"); | "Exception: Unknown"); |
response = request->buildResponse(); | response = request->buildResponse(); |
response->cimException = PEGASUS_CIM_EXCEPTION( | response->cimException = PEGASUS_CIM_EXCEPTION( |
|
|
// | // |
Array<CIMInstance> providerInstances = request->providers; | Array<CIMInstance> providerInstances = request->providers; |
| |
String physicalName = _resolvePhysicalName( |
|
mInstance.getProperty( |
|
mInstance.findProperty("Location")).getValue().toString()); |
|
|
|
for (Uint32 i = 0, n = providerInstances.size(); i < n; i++) | for (Uint32 i = 0, n = providerInstances.size(); i < n; i++) |
{ | { |
String pName; | String pName; |
|
|
providerInstances[i].findProperty("Name")). | providerInstances[i].findProperty("Name")). |
getValue().get(pName); | getValue().get(pName); |
| |
Sint16 ret_value = _disableProvider(pName); |
Sint16 ret_value = _disableProvider(moduleName, pName); |
| |
if (ret_value == 0) | if (ret_value == 0) |
{ | { |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Exception: Unknown"); | "Exception: Unknown"); |
cimException = PEGASUS_CIM_EXCEPTION_L( | cimException = PEGASUS_CIM_EXCEPTION_L( |
CIM_ERR_FAILED, | CIM_ERR_FAILED, |
|
|
{ | { |
String providerName; | String providerName; |
String fileName; | String fileName; |
String interfaceName; |
String moduleName; |
CIMValue genericValue; | CIMValue genericValue; |
| |
|
genericValue = providerId.getModule().getProperty( |
|
providerId.getModule().findProperty("Name")).getValue(); |
|
genericValue.get(moduleName); |
|
|
genericValue = providerId.getProvider().getProperty( | genericValue = providerId.getProvider().getProperty( |
providerId.getProvider().findProperty("Name")).getValue(); | providerId.getProvider().findProperty("Name")).getValue(); |
genericValue.get(providerName); | genericValue.get(providerName); |
|
|
genericValue = providerId.getModule().getProperty( | genericValue = providerId.getModule().getProperty( |
providerId.getModule().findProperty("Location")).getValue(); | providerId.getModule().findProperty("Location")).getValue(); |
genericValue.get(fileName); | genericValue.get(fileName); |
fileName = _resolvePhysicalName(fileName); |
|
| |
// ATTN: This attribute is probably not required |
String resolvedFileName = _resolvePhysicalName(fileName); |
|
|
|
if (resolvedFileName == String::EMPTY) |
|
{ |
|
// Provider library not found |
|
String moduleName; |
genericValue = providerId.getModule().getProperty( | genericValue = providerId.getModule().getProperty( |
providerId.getModule().findProperty("InterfaceType")).getValue(); |
providerId.getModule().findProperty("Name")).getValue(); |
genericValue.get(interfaceName); |
genericValue.get(moduleName); |
|
|
|
throw Exception(MessageLoaderParms( |
|
"ProviderManager.ProviderManagerService.PROVIDER_FILE_NOT_FOUND", |
|
"File \"$0\" was not found for provider module \"$1\".", |
|
FileSystem::buildLibraryFileName(fileName), moduleName)); |
|
} |
| |
return ProviderName(providerName, fileName, interfaceName, 0); |
return ProviderName(moduleName, providerName, resolvedFileName); |
} | } |
| |
ProviderOperationCounter DefaultProviderManager::_getProvider( | ProviderOperationCounter DefaultProviderManager::_getProvider( |
const String& moduleFileName, | const String& moduleFileName, |
|
const String& moduleName, |
const String& providerName) | const String& providerName) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, | PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"DefaultProviderManager::_getProvider"); | "DefaultProviderManager::_getProvider"); |
| |
ProviderMessageHandler* pr = _lookupProvider(providerName); |
ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName); |
| |
if (!pr->status.isInitialized()) | if (!pr->status.isInitialized()) |
{ | { |
|
|
} | } |
| |
ProviderMessageHandler* DefaultProviderManager::_lookupProvider( | ProviderMessageHandler* DefaultProviderManager::_lookupProvider( |
|
const String& moduleName, |
const String& providerName) | const String& providerName) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, | PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
|
|
// lock the providerTable mutex | // lock the providerTable mutex |
AutoMutex lock(_providerTableMutex); | AutoMutex lock(_providerTableMutex); |
| |
|
// Construct the lookup key. We need a compound key to differentiate |
|
// providers with the same name from different modules. The size field is |
|
// added to handle the unlikely case when moduleName+providerName |
|
// produce identical strings but define different providers. |
|
char buffer[12]; |
|
sprintf(buffer, "%u:", providerName.size()); |
|
const String key = buffer + moduleName + ":" + providerName; |
|
|
// look up provider in cache | // look up provider in cache |
ProviderMessageHandler* pr = 0; | ProviderMessageHandler* pr = 0; |
if (_providers.lookup(providerName, pr)) |
if (_providers.lookup(key, pr)) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Found Provider " + providerName + " in Provider Manager Cache"); | "Found Provider " + providerName + " in Provider Manager Cache"); |
|
|
{ | { |
// create provider | // create provider |
pr = new ProviderMessageHandler( | pr = new ProviderMessageHandler( |
providerName, 0, _indicationCallback, _responseChunkCallback, |
moduleName, providerName, |
|
0, _indicationCallback, _responseChunkCallback, |
_subscriptionInitComplete); | _subscriptionInitComplete); |
| |
// insert provider in provider table | // insert provider in provider table |
_providers.insert(providerName, pr); |
_providers.insert(key, pr); |
| |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Created provider " + pr->getName()); | "Created provider " + pr->getName()); |
|
|
try | try |
{ | { |
AutoMutex lock(_providerTableMutex); | AutoMutex lock(_providerTableMutex); |
Tracer::trace(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Number of providers in _providers table = %d", _providers.size()); |
"Number of 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; |
|
|
CIMValue(provider->status.isIdle()).toString()); | CIMValue(provider->status.isIdle()).toString()); |
| |
if (provider->status.isIdle() && | if (provider->status.isIdle() && |
((now.tv_sec - providerTime.tv_sec) > ((Sint32)IDLE_LIMIT))) |
((now.tv_sec - providerTime.tv_sec) > |
|
((Sint32)PEGASUS_PROVIDER_IDLE_TIMEOUT_SECONDS))) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Unloading idle provider: " + provider->getName()); | "Unloading idle provider: " + provider->getName()); |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
"Caught unexpected exception in unloadIdleProviders."); | "Caught unexpected exception in unloadIdleProviders."); |
} | } |
| |
|
|
{ | { |
AutoMutex lock(_providerTableMutex); | AutoMutex lock(_providerTableMutex); |
| |
Tracer::trace(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE((TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"providers in cache = %d", _providers.size()); |
"providers in cache = %d", _providers.size())); |
| |
for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) | for (ProviderTable::Iterator i = _providers.start(); i != 0; i++) |
{ | { |
|
|
} | } |
catch (...) | catch (...) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Unexpected Exception in _shutdownAllProviders()."); | "Unexpected Exception in _shutdownAllProviders()."); |
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |
Sint16 DefaultProviderManager::_disableProvider(const String& providerName) |
Sint16 DefaultProviderManager::_disableProvider( |
|
const String& moduleName, |
|
const String& providerName) |
{ | { |
PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, | PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, |
"DefaultProviderManager::_disableProvider"); | "DefaultProviderManager::_disableProvider"); |
| |
ProviderMessageHandler* pr = _lookupProvider(providerName); |
ProviderMessageHandler* pr = _lookupProvider(moduleName, providerName); |
if (!pr->status.isInitialized()) | if (!pr->status.isInitialized()) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, | PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
|
|
// There are still pending requests, do not disable | // There are still pending requests, do not disable |
if (pr->status.numCurrentOperations() > 0) | if (pr->status.numCurrentOperations() > 0) |
{ | { |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
PEG_TRACE_CSTRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4, |
"Disable failed since there are pending requests."); | "Disable failed since there are pending requests."); |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
return 0; | return 0; |
|
|
| |
// unload provider module | // unload provider module |
PEGASUS_ASSERT(provider->status.getModule() != 0); | PEGASUS_ASSERT(provider->status.getModule() != 0); |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2, |
PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL3, |
"Unloading provider module: " + provider->getName()); | "Unloading provider module: " + provider->getName()); |
provider->status.getModule()->unloadModule(); | provider->status.getModule()->unloadModule(); |
| |
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
PEG_TRACE(( |
"DefaultProviderManager: Unloaded provider $0", |
TRC_PROVIDERMANAGER, |
provider->getName()); |
Tracer::LEVEL3, |
|
"DefaultProviderManager: Unloaded provider %s", |
|
(const char*) provider->getName().getCString())); |
| |
// NOTE: The "delete provider->status.getCIMOMHandle()" operation | // NOTE: The "delete provider->status.getCIMOMHandle()" operation |
// was moved to be called after the unloadModule() call above | // was moved to be called after the unloadModule() call above |