diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp | 85 |
1 files changed, 59 insertions, 26 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp index c5e37b2a796..6e942c64645 100644 --- a/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp +++ b/TAO/orbsvcs/orbsvcs/Event/EC_ProxyConsumer.cpp @@ -31,12 +31,6 @@ TAO_EC_ProxyPushConsumer::~TAO_EC_ProxyPushConsumer (void) this->event_channel_->destroy_consumer_lock (this->lock_); } -PortableServer::POA_ptr -TAO_EC_ProxyPushConsumer::_default_POA (CORBA::Environment&) -{ - return PortableServer::POA::_duplicate (this->default_POA_.in ()); -} - void TAO_EC_ProxyPushConsumer::connected (TAO_EC_ProxyPushSupplier* supplier, CORBA::Environment &ACE_TRY_ENV) @@ -65,6 +59,55 @@ TAO_EC_ProxyPushConsumer::disconnected (TAO_EC_ProxyPushConsumer*, { } +void +TAO_EC_ProxyPushConsumer::shutdown (CORBA::Environment &ACE_TRY_ENV) +{ + RtecEventComm::PushSupplier_var supplier; + + { + ACE_GUARD_THROW_EX ( + ACE_Lock, ace_mon, *this->lock_, + RtecEventChannelAdmin::EventChannel::SYNCHRONIZATION_ERROR ()); + ACE_CHECK; + + if (this->is_connected_i () == 0) + return; + + supplier = this->supplier_._retn (); + + this->cleanup_i (); + } + + this->deactivate (ACE_TRY_ENV); + ACE_CHECK; + + supplier->disconnect_push_supplier (ACE_TRY_ENV); +} + +void +TAO_EC_ProxyPushConsumer::cleanup_i (void) +{ + this->supplier_ = + RtecEventComm::PushSupplier::_nil (); + + this->filter_->unbind (this); + this->event_channel_->supplier_filter_builder ()->destroy (this->filter_); + this->filter_ = 0; +} + +void +TAO_EC_ProxyPushConsumer::deactivate (CORBA::Environment &ACE_TRY_ENV) +{ + PortableServer::POA_var poa = + this->_default_POA (ACE_TRY_ENV); + ACE_CHECK; + PortableServer::ObjectId_var id = + poa->servant_to_id (this, ACE_TRY_ENV); + ACE_CHECK; + poa->deactivate_object (id.in (), ACE_TRY_ENV); + ACE_CHECK; +} + CORBA::ULong TAO_EC_ProxyPushConsumer::_incr_refcnt (void) { @@ -106,12 +149,7 @@ TAO_EC_ProxyPushConsumer::connect_push_supplier ( // Re-connections are allowed, go ahead and disconnect the // consumer... - this->supplier_ = - RtecEventComm::PushSupplier::_nil (); - - this->filter_->unbind (this); - this->event_channel_->supplier_filter_builder ()->destroy (this->filter_); - this->filter_ = 0; + this->cleanup_i (); // @@ Please read the comments in EC_ProxySuppliers about // possible race conditions in this area... @@ -167,23 +205,12 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer ( ACE_CHECK; if (this->is_connected_i () == 0) - ACE_THROW (CORBA::BAD_INV_ORDER ()); - - this->supplier_ = - RtecEventComm::PushSupplier::_nil (); + ACE_THROW (CORBA::BAD_INV_ORDER ()); // @@ add user exception? - this->filter_->unbind (this); - this->event_channel_->supplier_filter_builder ()->destroy (this->filter_); - this->filter_ = 0; + this->cleanup_i (); } - PortableServer::POA_var poa = - this->_default_POA (ACE_TRY_ENV); - ACE_CHECK; - PortableServer::ObjectId_var id = - poa->servant_to_id (this, ACE_TRY_ENV); - ACE_CHECK; - poa->deactivate_object (id.in (), ACE_TRY_ENV); + this->deactivate (ACE_TRY_ENV); ACE_CHECK; // Notify the event channel... @@ -192,6 +219,12 @@ TAO_EC_ProxyPushConsumer::disconnect_push_consumer ( this->_decr_refcnt (); } +PortableServer::POA_ptr +TAO_EC_ProxyPushConsumer::_default_POA (CORBA::Environment&) +{ + return PortableServer::POA::_duplicate (this->default_POA_.in ()); +} + void TAO_EC_ProxyPushConsumer::_add_ref (CORBA::Environment &) { |