1 karl 1.40 //%2006////////////////////////////////////////////////////////////////////////
|
2 kumpf 1.1 //
|
3 karl 1.25 // 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 karl 1.12 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.25 // 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.28 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 karl 1.40 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
12 // EMC Corporation; Symantec Corporation; The Open Group.
|
13 kumpf 1.1 //
14 // Permission is hereby granted, free of charge, to any person obtaining a copy
15 // of this software and associated documentation files (the "Software"), to
16 // deal in the Software without restriction, including without limitation the
17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
18 // sell copies of the Software, and to permit persons to whom the Software is
19 // furnished to do so, subject to the following conditions:
|
20 karl 1.40 //
|
21 kumpf 1.1 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
22 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
27 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 //==============================================================================
31 //
32 //%/////////////////////////////////////////////////////////////////////////////
33
|
34 tony 1.8 #include "CIMListener.h"
35 #include <Pegasus/Common/Exception.h>
36 #include <Pegasus/Common/SSLContext.h>
37 #include <Pegasus/Common/Monitor.h>
|
38 kumpf 1.1 #include <Pegasus/Common/HTTPAcceptor.h>
|
39 kumpf 1.11 #include <Pegasus/Common/PegasusVersion.h>
|
40 konrad.r 1.38 #include <Pegasus/Common/MessageLoader.h>
|
41 kumpf 1.44 #include <Pegasus/Common/Time.h>
|
42 kumpf 1.1 #include <Pegasus/ExportServer/CIMExportResponseEncoder.h>
43 #include <Pegasus/ExportServer/CIMExportRequestDecoder.h>
|
44 tony 1.8 #include <Pegasus/Consumer/CIMIndicationConsumer.h>
45 #include <Pegasus/Listener/CIMListenerIndicationDispatcher.h>
46
47 PEGASUS_NAMESPACE_BEGIN
|
48 mike 1.41
49 ////////////////////////////////////////////////////////////////////////////////
50 //
|
51 tony 1.8 // CIMListenerService
|
52 mike 1.41 //
53 ////////////////////////////////////////////////////////////////////////////////
54
|
55 tony 1.8 class CIMListenerService
56 {
57 public:
|
58 mike 1.41 CIMListenerService(Uint32 portNumber, SSLContext * sslContext = NULL);
59 CIMListenerService(CIMListenerService & svc);
60 ~CIMListenerService();
61
62 void init();
63
64 /** bind to the port
65 */
66 void bind();
67
68 /** runForever Main runloop for the server.
69 */
70 void runForever();
71
72 /** Call to gracefully shutdown the server. The server connection socket
73 will be closed to disable new connections from clients.
74 */
75 void stopClientConnection();
76
77 /** Call to gracefully shutdown the server. It is called when the server
78 has been stopped and is ready to be shutdown. Next time runForever()
79 mike 1.41 is called, the server shuts down.
80 */
81 void shutdown();
82
83 /** Return true if the server has shutdown, false otherwise.
84 */
85 Boolean terminated() const
86 {
87 return _dieNow;
88 };
|
89 david.dillard 1.34
|
90 mike 1.41 /** Call to resume the sever.
91 */
92 void resume();
93
94 /** Call to set the CIMServer state. Also inform the appropriate
95 message queues about the current state of the CIMServer.
96 */
97 void setState(Uint32 state);
98
99 Uint32 getOutstandingRequestCount();
100
101 /** Returns the indication listener dispatcher
102 */
103 CIMListenerIndicationDispatcher *getIndicationDispatcher() const;
104
105 /** Returns the indication listener dispatcher
106 */
107 void setIndicationDispatcher(CIMListenerIndicationDispatcher* dispatcher);
108
109 /** Returns the port number being used.
110 */
111 mike 1.41 Uint32 getPortNumber() const;
112
|
113 mike 1.42 static ThreadReturnType PEGASUS_THREAD_CDECL
|
114 mike 1.41 _listener_routine(void *param);
|
115 tony 1.8
116 private:
|
117 mike 1.41 Uint32 _portNumber;
118 SSLContext *_sslContext;
119 Monitor *_monitor;
120 Mutex _monitorMutex;
|
121 dave.sudlik 1.46.4.2 HTTPAcceptor *_ip6Acceptor;
122 HTTPAcceptor *_ip4Acceptor;
|
123 mike 1.41 Boolean _dieNow;
124 CIMListenerIndicationDispatcher *_dispatcher;
125 CIMExportResponseEncoder *_responseEncoder;
126 CIMExportRequestDecoder *_requestDecoder;
|
127 tony 1.8 };
128
|
129 mike 1.41 CIMListenerService::CIMListenerService(
130 Uint32 portNumber,
131 SSLContext * sslContext)
132 :
133 _portNumber(portNumber),
134 _sslContext(sslContext),
135 _monitor(NULL),
|
136 dave.sudlik 1.46.4.2 _ip6Acceptor(NULL),
137 _ip4Acceptor(NULL),
|
138 mike 1.41 _dieNow(false),
139 _dispatcher(NULL),
140 _responseEncoder(NULL),
141 _requestDecoder(NULL)
|
142 tony 1.8 {
143 }
144
|
145 mike 1.41 CIMListenerService::CIMListenerService(CIMListenerService & svc) :
146 _portNumber(svc._portNumber),
147 _sslContext(svc._sslContext),
148 _monitor(NULL),
|
149 dave.sudlik 1.46.4.2 _ip6Acceptor(NULL),
150 _ip4Acceptor(NULL),
|
151 mike 1.41 _dieNow(svc._dieNow),
152 _dispatcher(NULL),
153 _responseEncoder(NULL),
154 _requestDecoder(NULL)
|
155 tony 1.8 {
156 }
|
157 mike 1.41
|
158 tony 1.8 CIMListenerService::~CIMListenerService()
159 {
|
160 kumpf 1.36 delete _responseEncoder;
161 delete _requestDecoder;
|
162 dave.sudlik 1.46.4.2 delete _ip6Acceptor;
163 delete _ip4Acceptor;
|
164 kumpf 1.36 delete _monitor;
|
165 tony 1.8 }
|
166 kumpf 1.1
|
167 tony 1.8 void CIMListenerService::init()
|
168 kumpf 1.1 {
|
169 mike 1.41 PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::init");
|
170 kumpf 1.1
|
171 mike 1.41 if (NULL == _monitor)
172 _monitor = new Monitor();
|
173 david.dillard 1.31
|
174 mike 1.41 // _dispatcher = new CIMListenerIndicationDispatcher();
|
175 kumpf 1.1
|
176 mike 1.41 if (NULL == _responseEncoder)
177 _responseEncoder = new CIMExportResponseEncoder();
|
178 tony 1.8
|
179 mike 1.41 if (NULL == _requestDecoder)
180 {
181 _requestDecoder = new CIMExportRequestDecoder(
182 _dispatcher, _responseEncoder->getQueueId());
183 }
|
184 dave.sudlik 1.46.4.2 #ifdef PEGASUS_ENABLE_IPV6
|
185 venkat.puvvada 1.46.4.3 if (System::isIPv6StackActive())
|
186 mike 1.41 {
|
187 venkat.puvvada 1.46.4.3 if (NULL == _ip6Acceptor)
188 {
189 _ip6Acceptor = new HTTPAcceptor(
190 _monitor, _requestDecoder, HTTPAcceptor::IPV6_CONNECTION,
191 _portNumber, _sslContext, false);
192 }
|
193 mike 1.41 }
|
194 venkat.puvvada 1.46.4.3 #ifndef PEGASUS_OS_TYPE_WINDOWS
195 else
196 #endif
|
197 dave.sudlik 1.46.4.2 #endif
198 if (NULL == _ip4Acceptor)
199 {
200 _ip4Acceptor = new HTTPAcceptor(
201 _monitor, _requestDecoder, HTTPAcceptor::IPV4_CONNECTION,
202 _portNumber, _sslContext, false);
203 }
|
204 mike 1.41 bind();
205
206 PEG_METHOD_EXIT();
|
207 tony 1.8 }
|
208 david.dillard 1.34
|
209 tony 1.8 void CIMListenerService::bind()
210 {
|
211 dave.sudlik 1.46.4.2 if (_ip6Acceptor != NULL)
|
212 mike 1.41 {
|
213 dave.sudlik 1.46.4.2 _ip6Acceptor->bind();
214
215 Logger::put(
216 Logger::STANDARD_LOG,
217 System::CIMLISTENER,
218 Logger::INFORMATION,
219 "IPV6, Listening on HTTP port $0.",
220 _portNumber);
221 }
222 if (_ip4Acceptor != NULL)
223 {
224 _ip4Acceptor->bind();
|
225 kumpf 1.1
|
226 mike 1.41 Logger::put(
227 Logger::STANDARD_LOG,
228 System::CIMLISTENER,
229 Logger::INFORMATION,
|
230 dave.sudlik 1.46.4.2 "IPV4, Listening on HTTP for port $0.",
|
231 mike 1.41 _portNumber);
|
232 chuck 1.20 }
|
233 tony 1.8 }
|
234 chuck 1.20
|
235 tony 1.8 void CIMListenerService::runForever()
236 {
|
237 mike 1.41 if (!_dieNow)
|
238 dj.gorey 1.14 {
|
239 kumpf 1.43 _monitor->run(500000);
240 static struct timeval lastIdleCleanupTime = {0, 0};
241 struct timeval now;
|
242 kumpf 1.44 Time::gettimeofday(&now);
|
243 kumpf 1.43 if (now.tv_sec - lastIdleCleanupTime.tv_sec > 300)
|
244 mike 1.41 {
|
245 kumpf 1.43 lastIdleCleanupTime.tv_sec = now.tv_sec;
|
246 mike 1.41 try
247 {
248 MessageQueueService::get_thread_pool()->cleanupIdleThreads();
249 }
250 catch(...)
251 {
252 // Ignore!
253 }
254 }
|
255 chuck 1.20 }
|
256 tony 1.8 }
|
257 kumpf 1.1
|
258 tony 1.8 void CIMListenerService::shutdown()
259 {
260 PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::shutdown()");
|
261 kumpf 1.1
|
262 mike 1.41 // This logic signals the thread currently executing _listener_routine()
263 // to exit. That function deletes this instance of CIMListenerService,
264 // which deletes the _monitor member. We use a mutex to keep it from
265 // deleting the monitor until after tickle has been called.
266 {
267 AutoMutex am(_monitorMutex);
268 _dieNow = true;
269 _monitor->tickle();
270 }
|
271 kumpf 1.1
|
272 kumpf 1.4 PEG_METHOD_EXIT();
|
273 kumpf 1.1 }
274
|
275 tony 1.8 void CIMListenerService::resume()
|
276 kumpf 1.1 {
|
277 tony 1.8 PEG_METHOD_ENTER(TRC_LISTENER, "CIMListenerService::resume()");
|
278 dave.sudlik 1.46.4.2 if (_ip6Acceptor != NULL)
279 {
280 _ip6Acceptor->reopenConnectionSocket();
281 }
282 if (_ip4Acceptor != NULL)
283 {
284 _ip4Acceptor->reopenConnectionSocket();
285 }
|
286 kumpf 1.4 PEG_METHOD_EXIT();
|
287 kumpf 1.1 }
288
|
289 tony 1.8 void CIMListenerService::stopClientConnection()
|
290 kumpf 1.1 {
|
291 mike 1.41 PEG_METHOD_ENTER(
292 TRC_LISTENER,
293 "CIMListenerService::stopClientConnection()");
|
294 kumpf 1.1
|
295 kumpf 1.10 // tell Monitor to stop listening for client connections
|
296 chuck 1.22 _monitor->stopListeningForConnections(true);
|
297 dave.sudlik 1.46.4.2 if (_ip6Acceptor != NULL)
298 {
299 _ip6Acceptor->closeConnectionSocket();
300 }
301 if (_ip4Acceptor != NULL)
302 {
303 _ip4Acceptor->closeConnectionSocket();
304 }
|
305 kumpf 1.4 PEG_METHOD_EXIT();
|
306 kumpf 1.1 }
307
|
308 chuck 1.23 Uint32 CIMListenerService::getOutstandingRequestCount()
309 {
|
310 dave.sudlik 1.46.4.2 Uint32 cnt = 0;
|
311 venkat.puvvada 1.46.4.3
312 if (_ip6Acceptor)
313 {
314 cnt = _ip6Acceptor->getOutstandingRequestCount();
315 }
316
317 if (_ip4Acceptor)
318 {
319 cnt += _ip4Acceptor->getOutstandingRequestCount();
320 }
|
321 dave.sudlik 1.46.4.2
322 return cnt;
|
323 chuck 1.23 }
|
324 tony 1.8
|
325 mike 1.41 CIMListenerIndicationDispatcher*
326 CIMListenerService::getIndicationDispatcher() const
|
327 kumpf 1.1 {
|
328 david.dillard 1.32 return _dispatcher;
|
329 tony 1.8 }
|
330 david.dillard 1.34
|
331 mike 1.41 void CIMListenerService::setIndicationDispatcher(
332 CIMListenerIndicationDispatcher* dispatcher)
|
333 tony 1.8 {
|
334 david.dillard 1.32 _dispatcher = dispatcher;
|
335 kumpf 1.1 }
336
|
337 david.dillard 1.34 Uint32 CIMListenerService::getPortNumber() const
338 {
339 Uint32 portNumber = _portNumber;
340
|
341 dave.sudlik 1.46.4.2 if ((portNumber == 0) && (_ip6Acceptor != 0))
|
342 david.dillard 1.34 {
|
343 dave.sudlik 1.46.4.2 portNumber = _ip6Acceptor->getPortNumber();
|
344 david.dillard 1.34 }
|
345 venkat.puvvada 1.46.4.3 else if ((portNumber == 0) && (_ip4Acceptor != 0))
|
346 dave.sudlik 1.46.4.2 {
347 portNumber = _ip4Acceptor->getPortNumber();
348 }
|
349 david.dillard 1.34
|
350 mike 1.41 return (portNumber);
|
351 david.dillard 1.34 }
352
|
353 mike 1.42 ThreadReturnType PEGASUS_THREAD_CDECL
|
354 mike 1.41 CIMListenerService::_listener_routine(void *param)
|
355 kumpf 1.1 {
|
356 mike 1.41 CIMListenerService *svc = reinterpret_cast < CIMListenerService * >(param);
|
357 kumpf 1.1
|
358 mike 1.41 try
|
359 david.dillard 1.32 {
|
360 mike 1.41 // svc->init(); bug 1394
361 while (!svc->terminated())
362 {
|
363 mike 1.46 #if defined(PEGASUS_OS_DARWIN)
|
364 mike 1.41 pthread_testcancel();
|
365 chuck 1.20 #endif
|
366 mike 1.41 svc->runForever();
367 }
|
368 david.dillard 1.32 }
|
369 mike 1.41 catch(...)
370 {
|
371 marek 1.46.4.1 PEG_TRACE_CSTRING(TRC_SERVER, Tracer::LEVEL2,
|
372 mike 1.41 "Unknown exception thrown in _listener_routine.");
373 }
374
375 // CAUTION: deleting the service also deletes the monitor whose tickle()
376 // method may still be executing in another thread. This line of code was
377 // most likely reached when the CIMListenerService::shutdown() method set
378 // _dieNow to true and called Monitor::tickle(). We must wait until we
379 // can obtain the _monitorMutex, indicating that we are no longer inside
380 // Monitor::tickle().
|
381 mike 1.42 svc->_monitorMutex.lock();
|
382 mike 1.41 svc->_monitorMutex.unlock();
383 delete svc;
384
|
385 david.dillard 1.32 return 0;
|
386 tony 1.8 }
387
|
388 mike 1.41 ////////////////////////////////////////////////////////////////////////////////
389 //
|
390 tony 1.8 // CIMListenerRep
|
391 mike 1.41 //
392 ////////////////////////////////////////////////////////////////////////////////
393
|
394 tony 1.8 class CIMListenerRep
395 {
396 public:
|
397 mike 1.41 CIMListenerRep(Uint32 portNumber, SSLContext * sslContext = NULL);
398 ~CIMListenerRep();
|
399 tony 1.8
|
400 mike 1.41 Uint32 getPortNumber() const;
|
401 tony 1.8
|
402 mike 1.41 SSLContext *getSSLContext() const;
403 void setSSLContext(SSLContext * sslContext);
|
404 david.dillard 1.31
|
405 mike 1.41 void start();
406 void stop();
|
407 tony 1.8
|
408 mike 1.41 Boolean isAlive();
|
409 tony 1.8
|
410 mike 1.41 Boolean addConsumer(CIMIndicationConsumer * consumer);
411 Boolean removeConsumer(CIMIndicationConsumer * consumer);
|
412 tony 1.8
413 private:
|
414 mike 1.41 Boolean waitForPendingRequests(Uint32 shutdownTimeout);
|
415 chuck 1.23
|
416 mike 1.41 Uint32 _portNumber;
417 SSLContext *_sslContext;
|
418 tony 1.8
|
419 mike 1.41 CIMListenerIndicationDispatcher *_dispatcher;
420 ThreadPool *_thread_pool;
421 CIMListenerService *_svc;
422 Semaphore *_listener_sem;
|
423 tony 1.8 };
424
|
425 mike 1.41 CIMListenerRep::CIMListenerRep(
426 Uint32 portNumber,
427 SSLContext * sslContext)
428 :
429 _portNumber(portNumber),
430 _sslContext(sslContext),
431 _dispatcher(new CIMListenerIndicationDispatcher()),
432 _thread_pool(NULL),
433 _svc(NULL),
434 _listener_sem(NULL)
|
435 tony 1.8 {
436 }
|
437 david.dillard 1.31
|
438 tony 1.8 CIMListenerRep::~CIMListenerRep()
439 {
|
440 david.dillard 1.31 // if port is alive, clean up the port
441 if (_thread_pool != 0)
442 {
443 // Block incoming export requests and unbind the port
444 _svc->stopClientConnection();
445
446 // Wait until pending export requests in the server are done.
447 waitForPendingRequests(10);
|
448 chuck 1.23
|
449 david.dillard 1.31 // Shutdown the CIMListenerService
450 _svc->shutdown();
451 }
|
452 chuck 1.20
453 delete _sslContext;
454 delete _dispatcher;
455 delete _thread_pool;
456 delete _listener_sem;
|
457 tony 1.8
|
458 mike 1.41 // don't delete _svc, this is deleted by _listener_routine
|
459 tony 1.8 }
460
461 Uint32 CIMListenerRep::getPortNumber() const
462 {
|
463 david.dillard 1.34 Uint32 portNumber;
464
|
465 mike 1.41 if (_svc == 0)
|
466 david.dillard 1.34 portNumber = _portNumber;
|
467 mike 1.41 else
468 portNumber = _svc->getPortNumber();
|
469 david.dillard 1.34
470 return portNumber;
|
471 tony 1.8 }
|
472 kumpf 1.1
|
473 mike 1.41 SSLContext *CIMListenerRep::getSSLContext() const
|
474 tony 1.8 {
|
475 david.dillard 1.31 return _sslContext;
|
476 kumpf 1.1 }
|
477 david.dillard 1.31
|
478 mike 1.41 void CIMListenerRep::setSSLContext(SSLContext * sslContext)
|
479 tony 1.8 {
|
480 david.dillard 1.31 delete _sslContext;
481 _sslContext = sslContext;
482 }
|
483 kumpf 1.1
|
484 tony 1.8 void CIMListenerRep::start()
|
485 kumpf 1.1 {
|
486 david.dillard 1.31 // spawn a thread to do this
|
487 mike 1.41 if (_thread_pool == 0)
|
488 chuck 1.20 {
|
489 mike 1.41 AutoPtr < CIMListenerService >
490 svc(new CIMListenerService(_portNumber, _sslContext));
|
491 chuck 1.20
|
492 david.dillard 1.31 svc->setIndicationDispatcher(_dispatcher);
493 svc->init();
|
494 chuck 1.20
|
495 mike 1.41 struct timeval deallocateWait = { 15, 0 };
496 AutoPtr < ThreadPool >
497 threadPool(new ThreadPool(0, "Listener", 0, 1, deallocateWait));
498 AutoPtr < Semaphore > sem(new Semaphore(0));
499
500 if (threadPool->allocate_and_awaken(
501 svc.get(), CIMListenerService::_listener_routine, sem.get())
502 != PEGASUS_THREAD_OK)
503 {
504 Logger::put(
|
505 yi.zhou 1.45 Logger::STANDARD_LOG, System::CIMLISTENER,
|
506 mike 1.41 Logger::TRACE,
507 "Not enough threads to start CIMListernerService.");
508
|
509 marek 1.46.4.1 PEG_TRACE_CSTRING(
|
510 mike 1.41 TRC_SERVER,
511 Tracer::LEVEL2,
512 "Could not allocate thread for "
513 "CIMListenerService::_listener_routine.");
514 throw
515 Exception(MessageLoaderParms(
516 "Listener.CIMListener.CANNOT_ALLOCATE_THREAD",
517 "Could not allocate thread."));
|
518 konrad.r 1.38 }
|
519 mike 1.41
520 Logger::put(
521 Logger::STANDARD_LOG,
522 System::CIMLISTENER,
523 Logger::INFORMATION,
524 "CIMListener started");
|
525 david.dillard 1.31
526 _svc = svc.release();
527 _thread_pool = threadPool.release();
528 _listener_sem = sem.release();
529 }
|
530 tony 1.8 }
|
531 kumpf 1.1
|
532 tony 1.8 void CIMListenerRep::stop()
533 {
|
534 mike 1.41 if (_thread_pool != NULL)
|
535 chuck 1.20 {
|
536 mike 1.41 //
537 // Graceful shutdown of the listener service
538 //
539
540 // Block incoming export requests and unbind the port
541 _svc->stopClientConnection();
542
543 // Wait until pending export requests in the server are done.
544 waitForPendingRequests(10);
545
546 // Shutdown the CIMListenerService
547 _svc->shutdown();
|
548 chuck 1.20
|
549 mike 1.41 // Wait for the _listener_routine thread to exit.
550 // The thread could be delivering an export, so give it 3sec.
551 // Note that _listener_routine deletes the CIMListenerService,
552 // so no need to delete _svc.
553 try
554 {
555 _listener_sem->time_wait(3000);
556 }
557 catch(const TimeOut &)
558 {
559 // No need to do anything, the thread pool will be deleted below
560 // to cancel the _listener_routine thread if it is still running.
561 }
|
562 david.dillard 1.31
|
563 mike 1.41 delete _listener_sem;
564 _listener_sem = NULL;
|
565 chuck 1.20
|
566 mike 1.41 // Delete the thread pool. This cancels the listener thread if it is
567 // still
568 // running.
569 delete _thread_pool;
570 _thread_pool = NULL;
571
572 Logger::put(
573 Logger::STANDARD_LOG, System::CIMLISTENER,
574 Logger::INFORMATION, "CIMListener stopped");
575 }
|
576 kumpf 1.1 }
577
|
578 tony 1.8 Boolean CIMListenerRep::isAlive()
|
579 kumpf 1.1 {
|
580 mike 1.41 return (_thread_pool != NULL) ? true : false;
|
581 tony 1.8 }
|
582 kumpf 1.1
|
583 mike 1.41 Boolean CIMListenerRep::addConsumer(CIMIndicationConsumer * consumer)
|
584 tony 1.8 {
|
585 mike 1.41 return _dispatcher->addConsumer(consumer);
|
586 tony 1.8 }
|
587 mike 1.41
588 Boolean CIMListenerRep::removeConsumer(CIMIndicationConsumer * consumer)
|
589 tony 1.8 {
|
590 mike 1.41 return _dispatcher->removeConsumer(consumer);
|
591 tony 1.8 }
|
592 kumpf 1.1
|
593 chuck 1.23 Boolean CIMListenerRep::waitForPendingRequests(Uint32 shutdownTimeout)
594 {
|
595 mike 1.41 // Wait for 10 sec max
596 Uint32 reqCount;
597 Uint32 countDown = shutdownTimeout * 10;
598
599 for (; countDown > 0; countDown--)
600 {
601 reqCount = _svc->getOutstandingRequestCount();
602 if (reqCount > 0)
|
603 mike 1.42 Threads::sleep(100);
|
604 mike 1.41 else
605 return true;
606 }
|
607 david.dillard 1.31
|
608 mike 1.41 return false;
|
609 david.dillard 1.31 }
|
610 chuck 1.23
|
611 tony 1.8 /////////////////////////////////////////////////////////////////////////////
|
612 mike 1.41 //
|
613 tony 1.8 // CIMListener
|
614 mike 1.41 //
|
615 tony 1.8 /////////////////////////////////////////////////////////////////////////////
|
616 mike 1.41
617 CIMListener::CIMListener(
618 Uint32 portNumber,
619 SSLContext * sslContext)
620 :
621 _rep(new CIMListenerRep(portNumber, sslContext))
|
622 tony 1.8 {
623 }
|
624 mike 1.41
|
625 tony 1.8 CIMListener::~CIMListener()
626 {
|
627 mike 1.41 if (_rep != NULL)
628 delete static_cast < CIMListenerRep * >(_rep);
629 _rep = NULL;
|
630 tony 1.8 }
|
631 david.dillard 1.31
|
632 tony 1.8 Uint32 CIMListener::getPortNumber() const
633 {
|
634 mike 1.41 return static_cast < CIMListenerRep * >(_rep)->getPortNumber();
|
635 kumpf 1.1 }
636
|
637 mike 1.41 SSLContext *CIMListener::getSSLContext() const
|
638 tony 1.8 {
|
639 mike 1.41 return static_cast < CIMListenerRep * >(_rep)->getSSLContext();
|
640 tony 1.8 }
|
641 mike 1.41
642 void CIMListener::setSSLContext(SSLContext * sslContext)
|
643 tony 1.8 {
|
644 mike 1.41 static_cast < CIMListenerRep * >(_rep)->setSSLContext(sslContext);
|
645 tony 1.8 }
|
646 mike 1.41
|
647 tony 1.8 void CIMListener::start()
|
648 kumpf 1.1 {
|
649 mike 1.41 static_cast < CIMListenerRep * >(_rep)->start();
|
650 tony 1.8 }
|
651 mike 1.41
|
652 tony 1.8 void CIMListener::stop()
653 {
|
654 mike 1.41 static_cast < CIMListenerRep * >(_rep)->stop();
|
655 tony 1.8 }
|
656 kumpf 1.1
|
657 aruran.ms 1.35 Boolean CIMListener::isAlive() const
|
658 tony 1.8 {
|
659 mike 1.41 return static_cast < CIMListenerRep * >(_rep)->isAlive();
|
660 tony 1.8 }
|
661 kumpf 1.1
|
662 mike 1.41 Boolean CIMListener::addConsumer(CIMIndicationConsumer * consumer)
|
663 tony 1.8 {
|
664 mike 1.41 return static_cast < CIMListenerRep * >(_rep)->addConsumer(consumer);
|
665 tony 1.8 }
|
666 mike 1.41
667 Boolean CIMListener::removeConsumer(CIMIndicationConsumer * consumer)
|
668 tony 1.8 {
|
669 mike 1.41 return static_cast < CIMListenerRep * >(_rep)->removeConsumer(consumer);
|
670 kumpf 1.1 }
671
672 PEGASUS_NAMESPACE_END
|