(file) Return to CIMListener.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Listener

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

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2