(file) Return to CMPILocalProviderManager.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / ProviderManager2 / CMPI

Diff for /pegasus/src/Pegasus/ProviderManager2/CMPI/CMPILocalProviderManager.cpp between version 1.62 and 1.62.2.1

version 1.62, 2008/12/16 18:56:54 version 1.62.2.1, 2009/03/24 13:47:36
Line 285 
Line 285 
                 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,
Line 308 
Line 307 
                         }                         }
                         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 ();
                 }                 }
Line 1011 
Line 1002 
     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)


Legend:
Removed from v.1.62  
changed lines
  Added in v.1.62.2.1

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2