EC_Event_Channel_Base.cpp

Go to the documentation of this file.
00001 // EC_Event_Channel_Base.cpp,v 1.6 2006/03/14 06:14:25 jtc Exp
00002 
00003 #include "orbsvcs/Event/EC_Event_Channel_Base.h"
00004 #include "orbsvcs/Event/EC_Dispatching.h"
00005 #include "orbsvcs/Event/EC_ConsumerAdmin.h"
00006 #include "orbsvcs/Event/EC_SupplierAdmin.h"
00007 #include "orbsvcs/Event/EC_Timeout_Generator.h"
00008 #include "orbsvcs/Event/EC_ObserverStrategy.h"
00009 #include "orbsvcs/Event/EC_ConsumerControl.h"
00010 #include "orbsvcs/Event/EC_SupplierControl.h"
00011 #include "ace/Dynamic_Service.h"
00012 
00013 #if ! defined (__ACE_INLINE__)
00014 #include "orbsvcs/Event/EC_Event_Channel_Base.i"
00015 #endif /* __ACE_INLINE__ */
00016 
00017 ACE_RCSID(Event, EC_Event_Channel_Base, "EC_Event_Channel_Base.cpp,v 1.6 2006/03/14 06:14:25 jtc Exp")
00018 
00019 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00020 
00021 TAO_EC_Event_Channel_Base::
00022 TAO_EC_Event_Channel_Base (const TAO_EC_Event_Channel_Attributes& attr,
00023                            TAO_EC_Factory* factory,
00024                            int own_factory)
00025   : supplier_poa_ (PortableServer::POA::_duplicate (attr.supplier_poa)),
00026     consumer_poa_ (PortableServer::POA::_duplicate (attr.consumer_poa)),
00027     factory_ (factory),
00028     own_factory_ (own_factory),
00029     dispatching_ (0),
00030     filter_builder_ (0),
00031     supplier_filter_builder_ (0),
00032     consumer_admin_ (0),
00033     supplier_admin_ (0),
00034     timeout_generator_ (0),
00035     observer_strategy_ (0),
00036     scheduling_strategy_(0),
00037     consumer_reconnect_ (attr.consumer_reconnect),
00038     supplier_reconnect_ (attr.supplier_reconnect),
00039     disconnect_callbacks_ (attr.disconnect_callbacks),
00040     consumer_control_ (0),
00041     supplier_control_ (0),
00042     status_ (EC_S_IDLE)
00043 {
00044   this->scheduler_ =
00045     CORBA::Object::_duplicate (attr.scheduler);
00046 }
00047 
00048 TAO_EC_Event_Channel_Base::~TAO_EC_Event_Channel_Base (void)
00049 {
00050   // Destroy Strategies in the reverse order of creation, they
00051   // refere to each other during destruction and thus need to be
00052   // cleaned up properly.
00053   this->factory_->destroy_supplier_control (this->supplier_control_);
00054   this->supplier_control_ = 0;
00055   this->factory_->destroy_consumer_control (this->consumer_control_);
00056   this->consumer_control_ = 0;
00057 
00058   this->factory_->destroy_scheduling_strategy (this->scheduling_strategy_);
00059   this->scheduling_strategy_ = 0;
00060 
00061   this->factory_->destroy_observer_strategy (this->observer_strategy_);
00062   this->observer_strategy_ = 0;
00063 
00064   this->factory_->destroy_timeout_generator (this->timeout_generator_);
00065   this->timeout_generator_ = 0;
00066 
00067   this->factory_->destroy_supplier_admin (this->supplier_admin_);
00068   this->supplier_admin_ = 0;
00069   this->factory_->destroy_consumer_admin (this->consumer_admin_);
00070   this->consumer_admin_ = 0;
00071 
00072   this->factory_->destroy_supplier_filter_builder (this->supplier_filter_builder_);
00073   this->supplier_filter_builder_ = 0;
00074 
00075   this->factory_->destroy_filter_builder (this->filter_builder_);
00076   this->filter_builder_ = 0;
00077 
00078   this->factory_->destroy_dispatching (this->dispatching_);
00079   this->dispatching_ = 0;
00080 
00081   this->factory (0, 0);
00082 }
00083 
00084 void
00085 TAO_EC_Event_Channel_Base::create_strategies (void)
00086 {
00087   this->dispatching_ =
00088     this->factory_->create_dispatching (this);
00089   this->filter_builder_ =
00090     this->factory_->create_filter_builder (this);
00091   this->supplier_filter_builder_ =
00092     this->factory_->create_supplier_filter_builder (this);
00093   this->consumer_admin_ =
00094     this->factory_->create_consumer_admin (this);
00095   this->supplier_admin_ =
00096     this->factory_->create_supplier_admin (this);
00097   this->timeout_generator_ =
00098     this->factory_->create_timeout_generator (this);
00099   this->observer_strategy_ =
00100     this->factory_->create_observer_strategy (this);
00101 
00102   this->scheduling_strategy_ =
00103     this->factory_->create_scheduling_strategy (this);
00104 
00105   this->consumer_control_ =
00106     this->factory_->create_consumer_control (this);
00107   this->supplier_control_ =
00108     this->factory_->create_supplier_control (this);
00109 }
00110 
00111 void
00112 TAO_EC_Event_Channel_Base::activate (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
00113 {
00114   {
00115     // First check if the EC is idle, if it is not then we need to
00116     // return right away...
00117     ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00118     if (this->status_ != EC_S_IDLE)
00119       return;
00120     this->status_ = EC_S_ACTIVATING;
00121   }
00122   this->dispatching_->activate ();
00123   this->timeout_generator_->activate ();
00124   this->consumer_control_->activate ();
00125   this->supplier_control_->activate ();
00126   {
00127     // Only when all the operations complete successfully we can mark
00128     // the EC as active...
00129     ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00130     ACE_ASSERT (this->status_ == EC_S_ACTIVATING);
00131     this->status_ = EC_S_ACTIVE;
00132   }
00133 }
00134 
00135 void
00136 TAO_EC_Event_Channel_Base::shutdown (ACE_ENV_SINGLE_ARG_DECL)
00137 {
00138   {
00139     // First check if the EC is already active, if it is not then we
00140     // need to return right away...
00141     ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00142     if (this->status_ != EC_S_ACTIVE)
00143       return;
00144     this->status_ = EC_S_DESTROYING;
00145   }
00146   this->dispatching_->shutdown ();
00147   this->timeout_generator_->shutdown ();
00148   this->supplier_control_->shutdown ();
00149   this->consumer_control_->shutdown ();
00150 
00151   this->deactivate_supplier_admin ();
00152   this->deactivate_consumer_admin ();
00153 
00154   this->supplier_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00155   ACE_CHECK;
00156 
00157   this->consumer_admin_->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00158   ACE_CHECK;
00159 
00160   {
00161     // Wait until all the shutdown() operations return before marking
00162     // the EC as destroyed...
00163     ACE_GUARD (TAO_SYNCH_MUTEX, ace_mon, this->mutex_);
00164     ACE_ASSERT (this->status_ == EC_S_DESTROYING);
00165     this->status_ = EC_S_DESTROYED;
00166   }
00167 }
00168 
00169 void
00170 TAO_EC_Event_Channel_Base::deactivate_supplier_admin (void)
00171 {
00172   ACE_DECLARE_NEW_CORBA_ENV;
00173   ACE_TRY
00174     {
00175       PortableServer::POA_var supplier_poa =
00176         this->supplier_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00177       ACE_TRY_CHECK;
00178       PortableServer::ObjectId_var supplier_id =
00179         supplier_poa->servant_to_id (this->supplier_admin_ ACE_ENV_ARG_PARAMETER);
00180       ACE_TRY_CHECK;
00181       supplier_poa->deactivate_object (supplier_id.in () ACE_ENV_ARG_PARAMETER);
00182       ACE_TRY_CHECK;
00183     }
00184   ACE_CATCHANY
00185     {
00186             // The deactivation can throw...
00187     }
00188   ACE_ENDTRY;
00189 }
00190 
00191 void
00192 TAO_EC_Event_Channel_Base::deactivate_consumer_admin (void)
00193 {
00194   ACE_TRY_NEW_ENV
00195     {
00196       PortableServer::POA_var consumer_poa =
00197         this->consumer_admin_->_default_POA (ACE_ENV_SINGLE_ARG_PARAMETER);
00198       ACE_TRY_CHECK;
00199       PortableServer::ObjectId_var consumer_id =
00200         consumer_poa->servant_to_id (this->consumer_admin_ ACE_ENV_ARG_PARAMETER);
00201       ACE_TRY_CHECK;
00202       consumer_poa->deactivate_object (consumer_id.in () ACE_ENV_ARG_PARAMETER);
00203       ACE_TRY_CHECK;
00204     }
00205   ACE_CATCHANY
00206     {
00207             // The deactivation can throw...
00208     }
00209   ACE_ENDTRY;
00210 }
00211 
00212 void
00213 TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushConsumer* consumer
00214                                       ACE_ENV_ARG_DECL)
00215 {
00216   this->consumer_admin_->peer_connected (consumer ACE_ENV_ARG_PARAMETER);
00217   ACE_CHECK;
00218   this->supplier_admin_->connected (consumer ACE_ENV_ARG_PARAMETER);
00219   ACE_CHECK;
00220   this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
00221   ACE_CHECK;
00222 }
00223 
00224 void
00225 TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushConsumer* consumer
00226                                         ACE_ENV_ARG_DECL)
00227 {
00228   this->consumer_admin_->peer_reconnected (consumer ACE_ENV_ARG_PARAMETER);
00229   ACE_CHECK;
00230   this->supplier_admin_->reconnected (consumer ACE_ENV_ARG_PARAMETER);
00231   ACE_CHECK;
00232   this->observer_strategy_->connected (consumer ACE_ENV_ARG_PARAMETER);
00233   ACE_CHECK;
00234 }
00235 
00236 void
00237 TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushConsumer* consumer
00238                                          ACE_ENV_ARG_DECL)
00239 {
00240   this->consumer_admin_->peer_disconnected (consumer ACE_ENV_ARG_PARAMETER);
00241   ACE_CHECK;
00242   this->supplier_admin_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
00243   ACE_CHECK;
00244   this->observer_strategy_->disconnected (consumer ACE_ENV_ARG_PARAMETER);
00245   ACE_CHECK;
00246 }
00247 
00248 void
00249 TAO_EC_Event_Channel_Base::connected (TAO_EC_ProxyPushSupplier* supplier
00250                                       ACE_ENV_ARG_DECL)
00251 {
00252   this->supplier_admin_->peer_connected (supplier ACE_ENV_ARG_PARAMETER);
00253   ACE_CHECK;
00254   this->consumer_admin_->connected (supplier ACE_ENV_ARG_PARAMETER);
00255   ACE_CHECK;
00256   this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
00257   ACE_CHECK;
00258 }
00259 
00260 void
00261 TAO_EC_Event_Channel_Base::reconnected (TAO_EC_ProxyPushSupplier* supplier
00262                                         ACE_ENV_ARG_DECL)
00263 {
00264   this->supplier_admin_->peer_reconnected (supplier ACE_ENV_ARG_PARAMETER);
00265   ACE_CHECK;
00266   this->consumer_admin_->reconnected (supplier ACE_ENV_ARG_PARAMETER);
00267   ACE_CHECK;
00268   this->observer_strategy_->connected (supplier ACE_ENV_ARG_PARAMETER);
00269   ACE_CHECK;
00270 }
00271 
00272 void
00273 TAO_EC_Event_Channel_Base::disconnected (TAO_EC_ProxyPushSupplier* supplier
00274                                          ACE_ENV_ARG_DECL)
00275 {
00276   this->supplier_admin_->peer_disconnected (supplier ACE_ENV_ARG_PARAMETER);
00277   ACE_CHECK;
00278   this->consumer_admin_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
00279   ACE_CHECK;
00280   this->observer_strategy_->disconnected (supplier ACE_ENV_ARG_PARAMETER);
00281   ACE_CHECK;
00282 }
00283 
00284 RtecEventChannelAdmin::ConsumerAdmin_ptr
00285 TAO_EC_Event_Channel_Base::for_consumers (ACE_ENV_SINGLE_ARG_DECL)
00286   ACE_THROW_SPEC ((CORBA::SystemException))
00287 {
00288   return this->consumer_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00289 }
00290 
00291 RtecEventChannelAdmin::SupplierAdmin_ptr
00292 TAO_EC_Event_Channel_Base::for_suppliers (ACE_ENV_SINGLE_ARG_DECL)
00293   ACE_THROW_SPEC ((CORBA::SystemException))
00294 {
00295   return this->supplier_admin_->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
00296 }
00297 
00298 void
00299 TAO_EC_Event_Channel_Base::destroy (ACE_ENV_SINGLE_ARG_DECL)
00300   ACE_THROW_SPEC ((CORBA::SystemException))
00301 {
00302   this->shutdown (ACE_ENV_SINGLE_ARG_PARAMETER);
00303 }
00304 
00305 RtecEventChannelAdmin::Observer_Handle
00306 TAO_EC_Event_Channel_Base::append_observer (
00307        RtecEventChannelAdmin::Observer_ptr observer
00308        ACE_ENV_ARG_DECL)
00309     ACE_THROW_SPEC ((
00310         CORBA::SystemException,
00311         RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00312         RtecEventChannelAdmin::EventChannel::CANT_APPEND_OBSERVER))
00313 {
00314   return this->observer_strategy_->append_observer (observer
00315                                                     ACE_ENV_ARG_PARAMETER);
00316 }
00317 
00318 void
00319 TAO_EC_Event_Channel_Base::remove_observer (
00320        RtecEventChannelAdmin::Observer_Handle handle
00321        ACE_ENV_ARG_DECL)
00322     ACE_THROW_SPEC ((
00323         CORBA::SystemException,
00324         RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR,
00325         RtecEventChannelAdmin::EventChannel::CANT_REMOVE_OBSERVER))
00326 {
00327   this->observer_strategy_->remove_observer (handle
00328                                              ACE_ENV_ARG_PARAMETER);
00329 }
00330 
00331 void
00332 TAO_EC_Event_Channel_Base::for_each_consumer (
00333                     TAO_ESF_Worker<TAO_EC_ProxyPushSupplier> *worker
00334                     ACE_ENV_ARG_DECL)
00335   ACE_THROW_SPEC ((CORBA::SystemException))
00336 {
00337   this->consumer_admin_->for_each (worker
00338                                    ACE_ENV_ARG_PARAMETER);
00339   ACE_CHECK;
00340 }
00341 
00342 void
00343 TAO_EC_Event_Channel_Base::for_each_supplier (
00344                     TAO_ESF_Worker<TAO_EC_ProxyPushConsumer> *worker
00345                     ACE_ENV_ARG_DECL)
00346   ACE_THROW_SPEC ((CORBA::SystemException))
00347 {
00348   this->supplier_admin_->for_each (worker
00349                                    ACE_ENV_ARG_PARAMETER);
00350   ACE_CHECK;
00351 }
00352 
00353 TAO_END_VERSIONED_NAMESPACE_DECL

Generated on Thu Nov 9 13:11:07 2006 for TAO_RTEvent by doxygen 1.3.6