summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-05-27 18:44:13 +0000
committerjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-05-27 18:44:13 +0000
commit36bcf0543e6a1b93ce58f6a48d1059f280712e2c (patch)
tree0fe3a15868f936d81c1f16e3fe97cc7b3ecb5989
parent1cbfbd522ec781fae88a80cb0ef22febb08901da (diff)
downloadATCD-36bcf0543e6a1b93ce58f6a48d1059f280712e2c.tar.gz
Fri May 27 13:41:20 2005 Jaiganesh B <jai@dre.vanderbilt.edu>
-rw-r--r--TAO/CIAO/ChangeLog13
-rw-r--r--TAO/CIAO/DAnCE/ciao/Port_Activator.h4
-rw-r--r--TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp14
-rw-r--r--TAO/CIAO/DAnCE/ciao/Port_Activator_T.h4
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp36
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp48
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;