Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

SubscriptionManagerImpl.h

00001 
00002 #ifndef SCT_SUBSCRIPTIONMANAGER_H
00003 #define SCT_SUBSCRIPTIONMANAGER_H
00004 
00005 #include "SubscriptionManagerImpl.fwd"
00006 
00007 #include <boost/thread.hpp>
00008 #include <ipc/object.h>
00009 #include <ipc/server.h>
00010 #include "SubscriptionManager.hh"
00011 #include "SpecialSubscribeRequest.h"
00012 
00013 namespace Sct {
00014   
00015   class SubscriptionManagerImpl : public IPCNamedObject<POA_SubscriptionManagerModule::SubscriptionManager>, public IPCServer {
00016   private:
00017     typedef boost::recursive_mutex::scoped_lock LOCK;
00018   private:
00019     SubscriptionManagerImpl() : 
00020       IPCNamedObject<POA_SubscriptionManagerModule::SubscriptionManager>("SCT",
00021                                                                          SubscriptionManagerModule::SubscriptionManager::instanceName) {
00022     };
00023 
00024   public:
00025     static SubscriptionManagerImpl & instance() {
00026       static SubscriptionManagerImpl * theInstance = new SubscriptionManagerImpl();
00027       return *theInstance;
00028     };
00029 
00031     // Implementation of the methods declared in the SubscriptionManager.idl
00033 
00034     virtual CORBA::Long whatNumberIsThis(CORBA::Long number) {
00035       // not worth locking this method!
00036       return number;
00037     };
00038 
00039     virtual void registerNewIsServer(const char* serverName);
00040 
00041     virtual void subscribe_special(const char* serverPattern,
00042                                    const char* objectPattern,
00043                                    CORBA::Boolean server_is_regular_expression,
00044                                    CORBA::Boolean object_is_regular_expression,
00045                                    is::callback_ptr cb);
00047     virtual void debugDumpSubscriptions();
00048 
00049     virtual void shutdownNOW() {
00050       tidyUpAndWithdrawEtcNOW();
00051       this->stop(); // an IPCServer method!     
00052     };
00053 
00055     // Other things
00057 
00059     virtual void shutdown() {
00060       // can't think of anything to do here, but this is a pure virtual method of IPCServant that we must implement.
00061       LOCK lock(m_busy);
00062       this->shutdownNOW();
00063     };
00065     void startCatchingSignals();
00066     ~SubscriptionManagerImpl() {
00067       std::cout << "Withdrawing from service due to demise of self." << std::endl;
00068       this->tidyUpAndWithdrawEtc();
00069     };
00070 
00071     static void acceptSignal(int signum);
00072  private:
00073     void tidyUpAndWithdrawEtc();
00074     void tidyUpAndWithdrawEtcNOW();
00075     void launchOrdinarySubscriptionTo(const std::string & serverName, const SpecialSubscribeRequest & ssr);
00076     typedef std::list<SpecialSubscribeRequest *> SpecialSubscribeRequests;
00077     SpecialSubscribeRequests m_specialSubscribeRequests;
00078     boost::recursive_mutex m_busy;
00079   };
00080 
00081 };
00082 
00083 #endif

Generated on Fri Sep 16 18:01:59 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5