version 1.4.2.2, 2005/08/12 22:52:45
|
version 1.5, 2005/01/29 06:23:52
|
|
|
ProviderAgentRequest* agentRequest = | ProviderAgentRequest* agentRequest = |
new ProviderAgentRequest(this, request); | new ProviderAgentRequest(this, request); |
| |
ThreadStatus rtn = PEGASUS_THREAD_OK; |
while (!_threadPool.allocate_and_awaken( |
while ((rtn = _threadPool.allocate_and_awaken(agentRequest, |
agentRequest, |
ProviderAgent::_processRequestAndWriteResponse)) != |
ProviderAgent::_processRequestAndWriteResponse)) |
PEGASUS_THREAD_OK) |
|
{ |
|
if (rtn == PEGASUS_THREAD_INSUFFICIENT_RESOURCES) |
|
{ | { |
pegasus_yield(); | pegasus_yield(); |
} | } |
else |
|
{ |
|
Logger::put( |
|
Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"Not enough threads to process agent request."); |
|
|
|
Tracer::trace(TRC_PROVIDERAGENT, Tracer::LEVEL2, |
|
"Could not allocate thread to process agent request."); |
|
|
|
AutoPtr<CIMResponseMessage> response(request->buildResponse()); |
|
response->cimException = PEGASUS_CIM_EXCEPTION_L( |
|
CIM_ERR_FAILED, |
|
MessageLoaderParms( |
|
"ProviderManager.ProviderAgent.ProviderAgent." |
|
"THREAD_ALLOCATION_FAILED", |
|
"Failed to allocate a thread in cimprovagt \"$0\".", |
|
_agentId)); |
|
|
|
// Return response to CIM Server |
|
_writeResponse(response.get()); |
|
|
|
delete agentRequest; |
|
delete request; |
|
|
|
break; |
|
} |
|
} |
|
} | } |
| |
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
|
|
PEG_METHOD_ENTER(TRC_PROVIDERAGENT, "ProviderAgent::_unloadIdleProviders"); | PEG_METHOD_ENTER(TRC_PROVIDERAGENT, "ProviderAgent::_unloadIdleProviders"); |
| |
// Ensure that only one _unloadIdleProvidersHandler thread runs at a time | // Ensure that only one _unloadIdleProvidersHandler thread runs at a time |
ThreadStatus rtn = PEGASUS_THREAD_OK; |
|
_unloadIdleProvidersBusy++; | _unloadIdleProvidersBusy++; |
if ((_unloadIdleProvidersBusy.value() == 1) && | if ((_unloadIdleProvidersBusy.value() == 1) && |
((rtn =_threadPool.allocate_and_awaken( |
(_threadPool.allocate_and_awaken( |
(void*)this, ProviderAgent::_unloadIdleProvidersHandler)) == |
(void*)this, ProviderAgent::_unloadIdleProvidersHandler))) |
PEGASUS_THREAD_OK)) |
|
{ | { |
// _unloadIdleProvidersBusy is decremented in | // _unloadIdleProvidersBusy is decremented in |
// _unloadIdleProvidersHandler | // _unloadIdleProvidersHandler |
|
|
// If we fail to allocate a thread, don't retry now. | // If we fail to allocate a thread, don't retry now. |
_unloadIdleProvidersBusy--; | _unloadIdleProvidersBusy--; |
} | } |
if (rtn != PEGASUS_THREAD_OK) |
|
{ |
|
|
|
Logger::put(Logger::STANDARD_LOG, System::CIMSERVER, Logger::TRACE, |
|
"Not enough threads to unload idle providers."); |
|
| |
Tracer::trace(TRC_PROVIDERAGENT, Tracer::LEVEL2, |
|
"Could not allocate thread to unload idle providers."); |
|
} |
|
PEG_METHOD_EXIT(); | PEG_METHOD_EXIT(); |
} | } |
| |