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

  1 karl  1.7 //%2005////////////////////////////////////////////////////////////////////////
  2 schuur 1.1 //
  3 karl   1.6 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4            // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5            // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6            // IBM Corp.; EMC Corporation, The Open Group.
  7            // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8            // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9 karl   1.7 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10            // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 schuur 1.1 //
 12            // Permission is hereby granted, free of charge, to any person obtaining a copy
 13            // of this software and associated documentation files (the "Software"), to
 14            // deal in the Software without restriction, including without limitation the
 15            // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 16            // sell copies of the Software, and to permit persons to whom the Software is
 17            // furnished to do so, subject to the following conditions:
 18 karl   1.6 // 
 19 schuur 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 20            // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 21            // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 22            // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 23            // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 24            // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 25            // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 26            // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 27            //
 28            //==============================================================================
 29            //
 30            // Author: Chip Vincent (cvincent@us.ibm.com)
 31            //
 32            // Modified By: Yi Zhou, Hewlett-Packard Company(yi_zhou@hp.com)
 33            //              Mike Day IBM Corporation (mdday@us.ibm.com)
 34            //              Adrian Schuur, schuur@de.ibm.com
 35            //
 36            //%/////////////////////////////////////////////////////////////////////////////
 37            
 38            #include "JMPILocalProviderManager.h"
 39            
 40 schuur 1.1 #include <Pegasus/Common/Constants.h>
 41            #include <Pegasus/Common/Tracer.h>
 42            #include <Pegasus/Common/PegasusVersion.h>
 43            
 44            #include <Pegasus/ProviderManager2/JMPI/JMPIProvider.h>
 45            #include <Pegasus/ProviderManager2/JMPI/JMPIProviderModule.h>
 46            #include <Pegasus/ProviderManager2/ProviderManagerService.h>
 47            
 48            PEGASUS_USING_STD;
 49            PEGASUS_NAMESPACE_BEGIN
 50            
 51            JMPILocalProviderManager::JMPILocalProviderManager(void)
 52 kumpf  1.2     : _idle_timeout(IDLE_LIMIT)
 53 schuur 1.1 {
 54            }
 55            
 56            JMPILocalProviderManager::~JMPILocalProviderManager(void)
 57            {
 58                Uint32 ccode;
 59            
 60                _provider_ctrl(UNLOAD_ALL_PROVIDERS, this, &ccode);
 61            }
 62            
 63            Sint32 JMPILocalProviderManager::_provider_ctrl(CTRL code, void *parm, void *ret)
 64            {
 65            
 66                static Uint32 quantum;
 67                PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "_provider_ctrl");
 68            
 69                Sint32 ccode = 0;
 70                CTRL_STRINGS *parms = reinterpret_cast<CTRL_STRINGS *>(parm);
 71            
 72                switch(code)
 73                {
 74 schuur 1.1 
 75                case GET_PROVIDER:
 76                    {
 77                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
 78                            "_provider_ctrl::GET_PROVIDER");
 79            
 80                        JMPIProvider *pr = NULL;
 81                        JMPIProvider::OpProviderHolder* ph =
 82            	          reinterpret_cast< JMPIProvider::OpProviderHolder* >( ret );
 83            
 84            
 85                        if(true == _providers.lookup( *(parms->providerName), pr ))
 86                        {
 87                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 88                                "Found JMPIProvider " + *(parms->providerName) + " in JMPIProvider Manager Cache");
 89            
 90                            ph->SetProvider( pr );
 91            //                ph->GetProvider().update_idle_timer();
 92                            break;
 93                        }
 94            
 95 schuur 1.1 
 96                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
 97                            "Creating JMPIProvider " + *(parms->providerName) );
 98                        JMPIProviderModule *module;
 99            
100                        if(false  == _modules.lookup(*(parms->fileName), module))
101                        {
102                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
103                                "Creating JMPIProvider Module " + *(parms->fileName) );
104            
105                            module = new JMPIProviderModule(*(parms->fileName),*(parms->interfaceName));
106            
107                            _modules.insert((*parms->fileName), module);
108                        }
109                        else
110                        {
111                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
112                                "Using Cached  JMPIProvider Module " + *(parms->fileName) );
113                        }
114            
115            
116 schuur 1.1             PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
117                            "Loading/Linking JMPIProvider Module " + *(parms->fileName) );
118            
119                        ProviderVector base ;
120                        try
121                        {
122                            base = module->load(*(parms->fileName));
123                        }
124                        catch(...)
125                        {
126                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
127                                "Exception caught Loading/Linking JMPIProvider Module " + *(parms->fileName) );
128                            throw;
129                        }
130            
131                        // create provider module
132            
133                        MessageQueue * queue = MessageQueue::lookup(PEGASUS_QUEUENAME_PROVIDERMANAGER_CPP);
134                        PEGASUS_ASSERT(queue != 0);
135                        MessageQueueService * service = dynamic_cast<MessageQueueService *>(queue);
136                        PEGASUS_ASSERT(service != 0);
137 schuur 1.1             pr = new JMPIProvider(*(parms->providerName), module, &base);
138                        if(0 == (pr->_cimom_handle =  new CIMOMHandle()))
139                            throw NullPointer();
140                        pr->_quantum=0;
141            
142            
143                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
144                            "Loading JMPIProvider " +  pr->_name);
145                        try
146                        {
147                            pr->initialize(*(pr->_cimom_handle));
148                        }
149                        catch(...)
150                        {
151                            delete pr->_cimom_handle;
152                            delete pr;
153                            throw UninitializedObjectException();
154                        }
155            
156            //            pr->update_idle_timer();
157            
158 schuur 1.1             _providers.insert(*(parms->providerName), pr);
159            
160            
161                        ph->SetProvider( pr );
162                        break;
163                    }
164            
165                case UNLOAD_PROVIDER:
166                    { 
167            	    break;
168                    }
169            
170                case LOOKUP_PROVIDER:
171                    {
172            
173                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
174                            "_provider_ctrl::LOOKUP_PROVIDER");
175            
176                        if(true == _providers.lookup(*(parms->providerName),
177                            *(reinterpret_cast<JMPIProvider * *>(ret))))
178                        {
179 schuur 1.1                 PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
180                                "Found JMPIProvider in cache: " +
181                                *(parms->providerName));
182            
183            //                (*(reinterpret_cast<JMPIProvider * *>(ret)))->update_idle_timer();
184                        }
185                        else
186                        {
187            
188                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
189                                "Could not find  JMPIProvider in cache: " +
190                                *(parms->providerName));
191                            ccode = -1;
192                        }
193            
194                        break;
195                    }
196            
197                case LOOKUP_MODULE:
198                    {
199            
200 schuur 1.1             PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
201                            "_provider_ctrl::LOOKUP_MODULE");
202            
203                        if(false  == _modules.lookup(*(parms->fileName),
204                            *(reinterpret_cast<JMPIProviderModule * *>(ret))))
205                        {
206                            PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
207                                "Could not find  JMPIProvider Module in cache: " +
208                                *(parms->fileName));
209                            ccode = -1;
210                        }
211            
212                        break;
213                    }
214            
215                case INSERT_PROVIDER:
216                    {
217            
218                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
219                            "_provider_ctrl::INSERT_PROVIDER");
220                        if(false  == _providers.insert(
221 schuur 1.1                 *(parms->providerName),
222                            *reinterpret_cast<JMPIProvider * *>(parm)))
223                            ccode = -1;
224                        break;
225                    }
226                case INSERT_MODULE:
227                    {
228                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
229                            "_provider_ctrl::INSERT_MODULE");
230                        if(false  == _modules.insert(
231                            *(parms->fileName),
232                            *reinterpret_cast<JMPIProviderModule * *>(parm)))
233                            ccode = -1;
234                        break;
235                    }
236                case REMOVE_PROVIDER:
237                    {
238            
239                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
240                            "_provider_ctrl::REMOVE_PROVIDER");
241                        if(false == _providers.remove(*(parms->providerName)))
242 schuur 1.1                 ccode = -1;
243                        break;
244                    }
245                case REMOVE_MODULE:
246                    {
247            
248                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
249                            "_provider_ctrl::REMOVE_MODULE");
250                        if(false == _modules.remove(*(parms->fileName)))
251                            ccode = -1;
252                        break;
253                    }
254            
255                case UNLOAD_ALL_PROVIDERS:
256 schuur 1.4         {
257                       JMPIjvm::destroyJVM();
258            
259            	   break;
260 schuur 1.1         }
261            	
262                case UNLOAD_IDLE_PROVIDERS:
263                     { 
264            	    break;
265                    }
266            
267                case UNLOAD_IDLE_MODULES:
268                    { 
269            	    break;
270                    }
271            
272                default:
273                    ccode = -1;
274                    break;
275                }
276                PEG_METHOD_EXIT();
277                return(ccode);
278            }
279            
280            JMPIProvider * JMPILocalProviderManager::_getResolver
281 schuur 1.1    (const String & fileName, const String & interfaceType)
282            {
283                JMPIProvider *pr;
284                String id(interfaceType+String("::")+fileName);
285                if (true == _resolvers.lookup(id,pr)) {
286                   return pr;
287                }
288                return NULL;
289            }
290            /*
291            CMPIResolverModule *JMPILocalProviderManager::_loadResolver
292               (const String & fileName)
293            {
294               CMPIResolverModule *rm=new CMPIResolverModule(fileName);
295               rm->load();
296               return rm;
297            }
298            */
299            JMPIProvider::OpProviderHolder JMPILocalProviderManager::getProvider(
300                const String & fileName,
301                const String & providerName,
302 schuur 1.1     const String & interfaceName)
303            {
304                JMPIProvider::OpProviderHolder ph;
305                CTRL_STRINGS strings;
306                Sint32 ccode;
307                PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManager::getProvider");
308                strings.fileName = &fileName;
309                strings.providerName = &providerName;
310                strings.interfaceName = &interfaceName;
311            
312                try {
313                    ccode = _provider_ctrl( GET_PROVIDER, &strings, &ph );
314                }
315                catch (Exception e) {
316 schuur 1.5 #ifdef PEGASUS_DEBUG
317 schuur 1.3        cerr<<"--- loading proxy: "<<e.getMessage()<<endl;
318 schuur 1.5 #endif
319 schuur 1.1        PEG_METHOD_EXIT();
320                    throw;
321               }
322                catch(...) {
323                    PEG_METHOD_EXIT();
324                    throw;
325                }
326            
327            
328                PEG_METHOD_EXIT();
329                return(ph);
330            
331            }
332            
333            void JMPILocalProviderManager::unloadProvider(
334                const String & fileName,
335                const String & providerName)
336            {
337                CTRL_STRINGS strings;
338                PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManager::unloadProvider");
339                strings.fileName = &fileName;
340 schuur 1.1     strings.providerName = &providerName;
341                _provider_ctrl(UNLOAD_PROVIDER, &strings, (void *)0);
342                PEG_METHOD_EXIT();
343            }
344            
345            void JMPILocalProviderManager::shutdownAllProviders(void)
346            {
347            
348                PEG_METHOD_ENTER(TRC_PROVIDERMANAGER, "ProviderManager::shutdownAllProviders");
349                _provider_ctrl(UNLOAD_ALL_PROVIDERS, (void *)this, (void *)0);
350                PEG_METHOD_EXIT();
351            }
352            
353            
354 kumpf  1.2 Boolean JMPILocalProviderManager::hasActiveProviders()
355 schuur 1.1 {
356 kumpf  1.2     PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
357                    "ProviderManager::hasActiveProviders");
358            
359                PEG_METHOD_EXIT();
360                return (_providers.size() > 0);
361            }
362            
363            void JMPILocalProviderManager::unloadIdleProviders()
364            {
365                PEG_METHOD_ENTER(TRC_PROVIDERMANAGER,
366                    "ProviderManager::unloadIdleProviders");
367            
368 schuur 1.1     static struct timeval first = {0,0}, now, last = {0,0};
369               
370                if(first.tv_sec == 0)
371 kumpf  1.2     {
372 schuur 1.1         gettimeofday(&first, NULL);
373 kumpf  1.2     }
374 schuur 1.1     gettimeofday(&now, NULL);
375 kumpf  1.2 
376                if (((now.tv_sec - first.tv_sec) > IDLE_LIMIT) &&
377                   ((now.tv_sec - last.tv_sec) > IDLE_LIMIT))
378 schuur 1.1     {
379                    gettimeofday(&last, NULL);
380 kumpf  1.2         PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL4,
381                        "Checking for Idle providers to unload.");
382                    try
383                    {
384                        _provider_ctrl(UNLOAD_IDLE_PROVIDERS, this, (void *)0);
385                    }
386                    catch(...)
387 schuur 1.1         {
388                        PEG_TRACE_STRING(TRC_PROVIDERMANAGER, Tracer::LEVEL2,
389 kumpf  1.2                 "Caught unexpected exception from UNLOAD_IDLE_PROVIDERS.");
390 schuur 1.1         }
391                }
392                PEG_METHOD_EXIT();
393            }
394            
395 carolann.graves 1.8 Array <JMPIProvider *>
396                     JMPILocalProviderManager::getIndicationProvidersToEnable ()
397                     {
398                         PEG_METHOD_ENTER (TRC_PROVIDERMANAGER,
399                             "JMPILocalProviderManager::getIndicationProvidersToEnable");
400                     
401                         Array <JMPIProvider *> enableProviders;
402                     
403                         Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4,
404                             "Number of providers in _providers table = %d", _providers.size ());
405                     
406                         try
407                         {
408                             AutoMutex lock (_providerTableMutex);
409                     
410                             //
411                             // Iterate through the _providers table
412                             //
413                             for (ProviderTable::Iterator i = _providers.start (); i != 0; i++)
414                             {
415                                 //
416 carolann.graves 1.8             //  Enable any indication provider with current subscriptions
417                                 //
418                                 JMPIProvider * provider = i.value ();
419                                 if (provider->testSubscriptions ())
420                                 {
421                                     enableProviders.append (provider);
422                                 }
423                             }
424                         }
425                         catch (CIMException & e)
426                         {
427                             PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
428                                 "CIMException: " + e.getMessage ());
429                         }
430                         catch (Exception & e)
431                         {
432                             PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
433                                 "Exception: " + e.getMessage ());
434                         }
435                         catch (...)
436                         {
437 carolann.graves 1.8         PEG_TRACE_STRING (TRC_DISCARDED_DATA, Tracer::LEVEL2,
438                                 "Unexpected error in getIndicationProvidersToEnable");
439                         }
440                     
441                         Tracer::trace (TRC_PROVIDERMANAGER, Tracer::LEVEL4,
442                             "Number of indication providers to enable = %d",
443                             enableProviders.size ());
444                     
445                         PEG_METHOD_EXIT ();
446                         return enableProviders;
447                     }
448                     
449                     
450 schuur          1.1 PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2