diff options
author | jai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-05-27 18:44:13 +0000 |
---|---|---|
committer | jai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-05-27 18:44:13 +0000 |
commit | 36bcf0543e6a1b93ce58f6a48d1059f280712e2c (patch) | |
tree | 0fe3a15868f936d81c1f16e3fe97cc7b3ecb5989 | |
parent | 1cbfbd522ec781fae88a80cb0ef22febb08901da (diff) | |
download | ATCD-36bcf0543e6a1b93ce58f6a48d1059f280712e2c.tar.gz |
Fri May 27 13:41:20 2005 Jaiganesh B <jai@dre.vanderbilt.edu>
-rw-r--r-- | TAO/CIAO/ChangeLog | 13 | ||||
-rw-r--r-- | TAO/CIAO/DAnCE/ciao/Port_Activator.h | 4 | ||||
-rw-r--r-- | TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp | 14 | ||||
-rw-r--r-- | TAO/CIAO/DAnCE/ciao/Port_Activator_T.h | 4 | ||||
-rw-r--r-- | TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp | 36 | ||||
-rw-r--r-- | TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp | 48 |
6 files changed, 109 insertions, 10 deletions
diff --git a/TAO/CIAO/ChangeLog b/TAO/CIAO/ChangeLog index 8916f78bf03..0423367bdc3 100644 --- a/TAO/CIAO/ChangeLog +++ b/TAO/CIAO/ChangeLog @@ -1,3 +1,16 @@ +Fri May 27 13:41:20 2005 Jaiganesh B <jai@dre.vanderbilt.edu> + + * DAnCE/ciao/Port_Activator.h: + * DAnCE/ciao/Port_Activator_T.cpp: + * DAnCE/ciao/Port_Activator_T.h: + * DAnCE/ciao/Servant_Activator.cpp: + * DAnCE/ciao/Servant_Impl_Base.cpp: + + Added support for deactivating facets and event consumers + when a component is getting deactivated. This fixes + couple of memory leaks in the DAnCE deployment scenarios. + + Thu May 26 22:55:26 2005 Jaiganesh B <jai@dre.vanderbilt.edu> * DAnCE/ciao/Servant_Impl_Base.cpp: diff --git a/TAO/CIAO/DAnCE/ciao/Port_Activator.h b/TAO/CIAO/DAnCE/ciao/Port_Activator.h index 71245214879..085f58936a2 100644 --- a/TAO/CIAO/DAnCE/ciao/Port_Activator.h +++ b/TAO/CIAO/DAnCE/ciao/Port_Activator.h @@ -64,6 +64,10 @@ namespace CIAO const PortableServer::ObjectId &oid ACE_ENV_ARG_DECL) = 0; + virtual void deactivate ( + const PortableServer::Servant servant + ACE_ENV_ARG_DECL) = 0; + protected: /// The object ID that is used to activate the servant within the /// POA. diff --git a/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp index de0369dc813..3cd741f9856 100644 --- a/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp +++ b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp @@ -33,6 +33,20 @@ namespace CIAO typename EXEC, typename CONTEXT, typename COMP_SERV> + void + Port_Activator_T<SERV, EXEC, CONTEXT, COMP_SERV>::deactivate ( + const PortableServer::Servant servant + ACE_ENV_ARG_DECL_NOT_USED) + { + SERVANT *s = dynamic_cast<SERVANT *> (servant); + s->_remove_ref (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + } + + template <typename SERV, + typename EXEC, + typename CONTEXT, + typename COMP_SERV> PortableServer::Servant Port_Activator_T<SERV, EXEC, CONTEXT, COMP_SERV>::activate ( const PortableServer::ObjectId &oid diff --git a/TAO/CIAO/DAnCE/ciao/Port_Activator_T.h b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.h index c5f179e01d6..8afa788b655 100644 --- a/TAO/CIAO/DAnCE/ciao/Port_Activator_T.h +++ b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.h @@ -56,6 +56,10 @@ namespace CIAO const PortableServer::ObjectId &oid ACE_ENV_ARG_DECL); + void deactivate ( + const PortableServer::Servant servant + ACE_ENV_ARG_DECL); + private: /// The executor EXEC *executor_; diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp index 1fcd756aa9c..848656f5b85 100644 --- a/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp +++ b/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp @@ -109,6 +109,8 @@ namespace CIAO // We should try avoiding making outbound calls with the // lock held. Oh well, let us get some sense of sanity in // CIAO to do think about these. + ACE_DEBUG ((LM_DEBUG, "Activating Port %s\n", + str.in ())); return this->pa_[t]->activate (oid ACE_ENV_ARG_PARAMETER); } @@ -119,15 +121,43 @@ namespace CIAO } void - Servant_Activator::etherealize (const PortableServer::ObjectId &, + Servant_Activator::etherealize (const PortableServer::ObjectId &oid, PortableServer::POA_ptr , - PortableServer::Servant , + PortableServer::Servant servant, CORBA::Boolean , CORBA::Boolean ACE_ENV_ARG_DECL_NOT_USED) ACE_THROW_SPEC ((CORBA::SystemException)) { - /// Need to investigate what needs to be handled here.. + CORBA::String_var str = + PortableServer::ObjectId_to_string (oid); + + const unsigned int sz = this->slot_index_; + + Port_Activator *tmp = 0; + + for (unsigned int t = 0; t != sz; ++t) + { + if (this->pa_.get (tmp, t) == -1) + { + ACE_DEBUG ((LM_DEBUG, "Could not get Port Activator\n")); + continue; + } + + if (tmp == 0) + { + ACE_DEBUG ((LM_DEBUG, "Port Activator is NULL\n")); + continue; + } + if (ACE_OS::strcmp (tmp->name (), + str.in ()) == 0) + { + ACE_DEBUG ((LM_DEBUG, "Deactivating Port %s\n", + str.in ())); + this->pa_[t]->deactivate (servant + ACE_ENV_ARG_PARAMETER); + } + } } bool diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp index 9352bd2fee9..7db2c5526b6 100644 --- a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp +++ b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp @@ -65,6 +65,7 @@ namespace CIAO ACE_THROW_SPEC ((CORBA::SystemException, Components::RemoveFailure)) { + // Removing Facets Components::FacetDescriptions_var facets = this->get_all_facets (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK; @@ -73,31 +74,63 @@ namespace CIAO CORBA::ULong i = 0; for (i = 0; i < facet_len; ++i) { - PortableServer::ObjectId_var id = + PortableServer::ObjectId_var facet_id = this->container_->the_facet_cons_POA ()->reference_to_id (facets[i]->facet_ref () ACE_ENV_ARG_PARAMETER); + ACE_TRY + { + this->container_->the_facet_cons_POA ()->deactivate_object + (facet_id ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, + "Facet not active\n"); + } + ACE_ENDTRY; + CIAO::Servant_Activator *sa = this->container_->ports_servant_activator (); + sa->update_port_activator (facet_id ACE_ENV_ARG_PARAMETER); + } + + // Removed Facets - sa->update_port_activator (id ACE_ENV_ARG_PARAMETER); + // Removing Consumers + Components::ConsumerDescriptions_var consumers = + this->get_all_consumers (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK; + + const CORBA::ULong consumer_len = consumers->length (); + CORBA::ULong j = 0; + for (j = 0; j < consumer_len; ++j) + { + PortableServer::ObjectId_var cons_id = + this->container_->the_facet_cons_POA ()->reference_to_id + (consumers[j]->consumer () ACE_ENV_ARG_PARAMETER); ACE_TRY { this->container_->the_facet_cons_POA ()->deactivate_object - (id ACE_ENV_ARG_PARAMETER); + (cons_id ACE_ENV_ARG_PARAMETER); ACE_TRY_CHECK; } ACE_CATCHANY { ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, - "Facet not active\n"); + "Consumer not active\n"); } ACE_ENDTRY; + + CIAO::Servant_Activator *sa = + this->container_->ports_servant_activator (); + sa->update_port_activator (cons_id ACE_ENV_ARG_PARAMETER); } - Components::SessionComponent_var temp = this->get_executor (); - temp->ccm_remove (ACE_ENV_SINGLE_ARG_PARAMETER); + Components::SessionComponent_var temp = this->get_executor (); + temp->ccm_remove (ACE_ENV_SINGLE_ARG_PARAMETER); CORBA::Object_var objref = this->container_->get_objref (this); @@ -262,7 +295,8 @@ namespace CIAO ::Components::ConsumerDescriptions *tmp = 0; ACE_NEW_THROW_EX (tmp, - ::Components::ConsumerDescriptions (this->consumer_table_.current_size ()), + ::Components::ConsumerDescriptions ( + this->consumer_table_.current_size ()), CORBA::NO_MEMORY ()); ::Components::ConsumerDescriptions_var retval = tmp; |