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
|