summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-02-02 21:21:05 +0000
committerjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-02-02 21:21:05 +0000
commite34254dfb73b75556cf91132d1fb98800ea751e5 (patch)
tree9629aa90afc2d2c057ac2b0ffac58be081de3f46
parent081a3196d22590bff4793d231b3e9c917d198bf4 (diff)
downloadATCD-e34254dfb73b75556cf91132d1fb98800ea751e5.tar.gz
Wed Feb 2 15:07:32 2005 Jaiganesh B <jai@dre.vanderbilt.edu>
-rw-r--r--TAO/CIAO/DAnCE/ciao/CCM_Core.mpc8
-rw-r--r--TAO/CIAO/DAnCE/ciao/Container_Base.cpp38
-rw-r--r--TAO/CIAO/DAnCE/ciao/Container_Base.h31
-rw-r--r--TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp9
-rw-r--r--TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_Base.h3
-rw-r--r--TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.cpp114
-rw-r--r--TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.h25
-rw-r--r--TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.cpp7
-rw-r--r--TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.h1
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp42
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h14
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp63
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h17
13 files changed, 300 insertions, 72 deletions
diff --git a/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc b/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
index 30b974517ad..0b0e3136fb7 100644
--- a/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
+++ b/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
@@ -50,6 +50,7 @@ project (CIAO_DnC_Container) : orbsvcslib, portableserver, security, valuetype,
CosPersistentState.idl
CCM_Container.idl
CCM_Container_Ex.idl
+ SwapExec.idl
}
Source_Files {
@@ -60,6 +61,7 @@ project (CIAO_DnC_Container) : orbsvcslib, portableserver, security, valuetype,
CCM_BaseS.cpp
CCM_EventS.cpp
CCM_ComponentS.cpp
+ SwapExecC.cpp
Cookies.cpp
}
@@ -143,12 +145,16 @@ project (CIAO_DnC_Server) : orbsvcslib, portableserver, valuetype, ifr_client, u
Source_Files {
Container_Base.cpp
+ Swapping_Container.cpp
NodeApplication_Impl.cpp
Context_Impl_Base.cpp
Home_Servant_Impl_Base.cpp
Servant_Impl_Base.cpp
+ Swapping_Servant_Home_Impl_Base.cpp
Server_init.cpp
Servant_Activator.cpp
+ Dynamic_Component_Activator.cpp
+ Dynamic_Component_Servant_Base.cpp
Port_Activator.cpp
StandardConfigurator_Impl.cpp
}
@@ -161,6 +167,8 @@ project (CIAO_DnC_Server) : orbsvcslib, portableserver, valuetype, ifr_client, u
Template_Files {
Context_Impl_T.cpp
Home_Servant_Impl_T.cpp
+ Swapping_Servant_Home_Impl_T.cpp
+ Dynamic_Component_Servant_T.cpp
Servant_Impl_T.cpp
Servant_Activator_T.cpp
}
diff --git a/TAO/CIAO/DAnCE/ciao/Container_Base.cpp b/TAO/CIAO/DAnCE/ciao/Container_Base.cpp
index 7a9124c4b95..f9d737b548e 100644
--- a/TAO/CIAO/DAnCE/ciao/Container_Base.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Container_Base.cpp
@@ -15,6 +15,12 @@ namespace CIAO
{
////////////////////////////////////////////////////////////////
+
+ Container::Container (void)
+ {
+ ACE_ASSERT (0);
+ }
+
Container::Container (CORBA::ORB_ptr o)
: orb_ (CORBA::ORB::_duplicate (o))
{
@@ -41,6 +47,11 @@ namespace CIAO
ACE_Atomic_Op <ACE_SYNCH_MUTEX, long>
Session_Container::serial_number_ (0);
+ Session_Container::Session_Container (void)
+ {
+ ACE_ASSERT (0);
+ }
+
Session_Container::Session_Container (CORBA::ORB_ptr o,
bool static_config_flag,
const Static_Config_EntryPoints_Maps* maps)
@@ -244,7 +255,6 @@ namespace CIAO
Deployment::ImplEntryPointNotFound,
Deployment::InstallationFailure))
{
-
HomeFactory hcreator = 0;
ServantFactory screator = 0;
@@ -390,7 +400,6 @@ namespace CIAO
ACE_ENV_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
-
PortableServer::ObjectId_var id =
this->component_poa_->reference_to_id (objref
ACE_ENV_ARG_PARAMETER);
@@ -403,6 +412,31 @@ namespace CIAO
oid = id._retn ();
}
+ void
+ Session_Container::add_servant_map
+ (PortableServer::ObjectId &,
+ Dynamic_Component_Servant_Base*
+ ACE_ENV_ARG_DECL)
+ {
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+ }
+
+ void
+ Session_Container::delete_servant_map
+ (PortableServer::ObjectId &
+ ACE_ENV_ARG_DECL)
+ {
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+ }
+
+ CORBA::Object_ptr
+ Session_Container::get_home_objref (PortableServer::Servant
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), 0);
+ }
+
CORBA::Object_ptr
Session_Container::generate_reference (const char *obj_id,
const char *repo_id,
diff --git a/TAO/CIAO/DAnCE/ciao/Container_Base.h b/TAO/CIAO/DAnCE/ciao/Container_Base.h
index b76cf9da544..2385b0a0a61 100644
--- a/TAO/CIAO/DAnCE/ciao/Container_Base.h
+++ b/TAO/CIAO/DAnCE/ciao/Container_Base.h
@@ -31,6 +31,7 @@
namespace CIAO
{
class Servant_Activator;
+ class Dynamic_Component_Servant_Base;
/**
* @class Container
@@ -49,6 +50,8 @@ namespace CIAO
Facet_Consumer
};
+ explicit Container (void);
+
Container (CORBA::ORB_ptr o);
virtual ~Container (void) = 0;
@@ -92,6 +95,16 @@ namespace CIAO
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+ virtual void add_servant_map (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant
+ ACE_ENV_ARG_DECL) = 0;
+
+ virtual void delete_servant_map (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL) = 0;
+
+ virtual CORBA::Object_ptr get_home_objref (PortableServer::Servant p
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
protected:
CORBA::ORB_var orb_;
@@ -107,6 +120,7 @@ namespace CIAO
* are distinct from the component.
*/
PortableServer::POA_var facet_cons_poa_;
+ PortableServer::POA_var home_servant_poa_;
};
class Session_Container;
@@ -145,6 +159,8 @@ namespace CIAO
{
public:
+ explicit Session_Container (void);
+
// @@ (OO) Does the static_config_flag really need to be an int?
// It appears to be a boolean value. Please use bool
// instead.
@@ -195,7 +211,7 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException));
// Install a servant for component or home.
- CORBA::Object_ptr install_servant (PortableServer::Servant p,
+ virtual CORBA::Object_ptr install_servant (PortableServer::Servant p,
Container::OA_Type t
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
@@ -207,7 +223,7 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException));
// Get an object reference to a component or home from the servant.
- CORBA::Object_ptr get_objref (PortableServer::Servant p
+ virtual CORBA::Object_ptr get_objref (PortableServer::Servant p
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
@@ -223,6 +239,17 @@ namespace CIAO
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void add_servant_map (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant
+ ACE_ENV_ARG_DECL);
+
+ virtual void delete_servant_map (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL);
+
+ virtual CORBA::Object_ptr get_home_objref (PortableServer::Servant p
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
// Analog of the POA method that creates an object reference from
// an object id string.
CORBA::Object_ptr generate_reference (const char *obj_id,
diff --git a/TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp b/TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp
index da166b8d174..232c102400b 100644
--- a/TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp
@@ -43,10 +43,17 @@ namespace CIAO
{
if (CORBA::is_nil (this->component_.in ()))
{
- CORBA::Object_var obj =
+ CORBA::Object_var obj;
+ ACE_TRY {
+ obj =
this->container_->get_objref (this->servant_
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (CORBA::Object::_nil ());
+ }
+ ACE_CATCHANY { ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
+ "Caught Exception \n"); return 0;}
+ ACE_ENDTRY;
+
this->component_ = COMP::_narrow (obj.in ()
ACE_ENV_ARG_PARAMETER);
diff --git a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_Base.h b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_Base.h
index bbca2a430ad..8fb03deb168 100644
--- a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_Base.h
+++ b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_Base.h
@@ -59,6 +59,9 @@ namespace CIAO
get_home_def (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual void
+ update_component_map (PortableServer::ObjectId &oid) = 0;
+
protected:
Session_Container *container_;
};
diff --git a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.cpp b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.cpp
index e12d589655d..d10336225bd 100644
--- a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.cpp
@@ -5,10 +5,11 @@
#include "Home_Servant_Impl_T.h"
+
namespace CIAO
{
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -31,8 +32,8 @@ namespace CIAO
{
}
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -48,12 +49,21 @@ namespace CIAO
COMP_EXEC_VAR,
COMP_SVNT>::~Home_Servant_Impl (void)
{
+ const OBJ_ITERATOR end =
+ this->objref_map_.end ();
+
+ for (OBJ_ITERATOR iter =
+ this->objref_map_.begin ();
+ iter != end; ++iter)
+ {
+ this->remove_component ((*iter).int_id_);
+ }
}
// Operations for CCMHome interface.
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -75,26 +85,64 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException,
Components::RemoveFailure))
{
- COMP_VAR _ciao_comp = COMP::_narrow (comp
- ACE_ENV_ARG_PARAMETER);
+ PortableServer::ObjectId_var oid =
+ this->container_->the_POA ()->reference_to_id (comp
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ Components::CCMObject_ptr ccm_obj_ptr;
+ if (objref_map_.find (oid.in (), ccm_obj_ptr) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Invalid component object reference\n"));
+ return;
+ }
+
+ COMP_VAR _ciao_comp =
+ COMP::_narrow (ccm_obj_ptr
+ ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (CORBA::is_nil (_ciao_comp.in ()))
- {
- ACE_THROW (CORBA::INTERNAL ());
- }
+ {
+ ACE_THROW (Components::RemoveFailure ());
+ }
_ciao_comp->remove (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
+ }
- this->_ciao_passivate_component (_ciao_comp.in ()
- ACE_ENV_ARG_PARAMETER);
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ void
+ Home_Servant_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::update_component_map (
+ PortableServer::ObjectId &oid)
+ {
+ Components::CCMObject_var ccm_obj_ptr;
+ if (objref_map_.unbind (oid, ccm_obj_ptr) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Invalid component object reference\n"));
+ return;
+ }
+ return;
}
// Operations for keyless home interface.
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -120,8 +168,8 @@ namespace CIAO
// Operations for implicit home interface.
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -163,8 +211,8 @@ namespace CIAO
// CIAO-specific operations.
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -185,7 +233,7 @@ namespace CIAO
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
- CORBA::Object_var hobj =
+ CORBA::Object_var hobj =
this->container_->get_objref (this
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (COMP::_nil ());
@@ -199,6 +247,7 @@ namespace CIAO
ACE_NEW_RETURN (svt,
COMP_SVNT (exe,
home.in (),
+ this,
this->container_),
COMP::_nil ());
@@ -215,16 +264,19 @@ namespace CIAO
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (COMP::_nil ());
- if (this->component_map_.bind (oid.in (), svt) == 0)
- {
- safe._retn ();
- }
+ Components::CCMObject_var ccmobjref =
+ Components::CCMObject::_narrow (objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (Components::CCMObject::_nil ());
+ this->objref_map_.bind (oid.in (),
+ Components::CCMObject::_duplicate (ccmobjref.in ()));
+
return ho._retn ();
}
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -250,16 +302,6 @@ namespace CIAO
oid.out ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
-
- COMP_SVNT *servant = 0;
-
- if (this->component_map_.unbind (oid.in (), servant) == 0)
- {
- PortableServer::ServantBase_var safe (servant);
-
- servant->_ciao_passivate (ACE_ENV_SINGLE_ARG_PARAMETER);
- ACE_CHECK;
- }
}
}
diff --git a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.h b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.h
index 8ff3e858990..7624ee69eb9 100644
--- a/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.h
+++ b/TAO/CIAO/DAnCE/ciao/Home_Servant_Impl_T.h
@@ -40,8 +40,8 @@ namespace CIAO
* This class implements operations
* common to all generated home servants.
*/
- template <typename BASE_SKEL,
- typename EXEC,
+ template <typename BASE_SKEL,
+ typename EXEC,
typename EXEC_VAR,
typename COMP,
typename COMP_VAR,
@@ -56,9 +56,9 @@ namespace CIAO
public:
Home_Servant_Impl (EXEC * exe,
Session_Container * c);
-
+
virtual ~Home_Servant_Impl (void);
-
+
// Operations for CCMHome interface.
virtual void
@@ -66,7 +66,7 @@ namespace CIAO
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException,
Components::RemoveFailure));
-
+
// Operations for keyless home interface.
virtual ::Components::CCMObject_ptr
@@ -81,6 +81,9 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException,
Components::CreateFailure));
+ virtual void
+ update_component_map (PortableServer::ObjectId &oid);
+
protected:
// CIAO-specific operations.
@@ -88,7 +91,7 @@ namespace CIAO
_ciao_activate_component (COMP_EXEC *exe
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
-
+
void
_ciao_passivate_component (COMP *comp
ACE_ENV_ARG_DECL_WITH_DEFAULTS)
@@ -97,12 +100,13 @@ namespace CIAO
protected:
EXEC_VAR executor_;
- ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
- COMP_SVNT *,
+ typedef ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
+ Components::CCMObject_ptr,
TAO_ObjectId_Hash,
ACE_Equal_To<PortableServer::ObjectId>,
- ACE_SYNCH_MUTEX>
- component_map_;
+ ACE_SYNCH_MUTEX> OBJREF_MAP;
+ typedef OBJREF_MAP::iterator OBJ_ITERATOR;
+ OBJREF_MAP objref_map_;
};
}
@@ -117,4 +121,3 @@ namespace CIAO
#include /**/ "ace/post.h"
#endif /* CIAO_HOME_SERVANT_IMPL_T_H */
-
diff --git a/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.cpp b/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.cpp
index a9299ce1d54..6797ba5b4e2 100644
--- a/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.cpp
+++ b/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.cpp
@@ -191,6 +191,7 @@ CIAO::NodeApplication_Impl::install (
for (CORBA::ULong i = 0; i < len; ++i)
{
+
home = this->install_home (impl_infos[i]
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
@@ -250,6 +251,7 @@ CIAO::NodeApplication_Impl::install (
}
}
+
}
}
ACE_CATCHANY
@@ -392,9 +394,7 @@ CIAO::NodeApplication_Impl::init (ACE_ENV_SINGLE_ARG_DECL)
ACE_THROW_SPEC ((CORBA::SystemException))
{
ACE_NEW_THROW_EX (this->container_,
- CIAO::Session_Container (this->orb_.in (),
- 0,
- 0),
+ CIAO::Swapping_Container (this->orb_.in ()),
CORBA::NO_MEMORY ());
ACE_CHECK_RETURN (-1);
@@ -445,6 +445,7 @@ CIAO::NodeApplication_Impl::remove_components (ACE_ENV_SINGLE_ARG_DECL)
}
this->component_map_.unbind_all ();
+
// To this point the servant should have been destroyed. However,
// if someone is still making calls on the servant, terrible thing
// will happen.
diff --git a/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.h b/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.h
index 64e497f2fdb..9fd4792e5f8 100644
--- a/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.h
+++ b/TAO/CIAO/DAnCE/ciao/NodeApplication_Impl.h
@@ -23,6 +23,7 @@
#include "ace/Synch.h"
#include "ace/Synch_Traits.h"
#include "Container_Base.h"
+#include "Swapping_Container.h"
#include "Deployment_CoreS.h"
#include "Server_init.h"
#include "CIAO_common.h"
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp
index b19a5de1f95..e21075b6bab 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp
@@ -11,8 +11,12 @@ namespace CIAO
ACE_ASSERT (0);
}
- Servant_Impl_Base::Servant_Impl_Base (Session_Container * c)
- : container_ (c)
+ Servant_Impl_Base::Servant_Impl_Base (Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
+ Session_Container * c)
+ : home_ (Components::CCMHome::_duplicate (home)),
+ home_servant_ (home_servant),
+ container_ (c)
{
}
@@ -61,7 +65,23 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException,
Components::RemoveFailure))
{
- // CIAO to-do
+ ACE_DEBUG ((LM_DEBUG, "i am being called to remove\n"));
+ Components::SessionComponent_var temp = this->get_executor ();
+ temp->ccm_passivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ CORBA::Object_var objref =
+ this->container_->get_objref (this);
+
+ Components::CCMObject_var ccmobjref =
+ Components::CCMObject::_narrow (objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+ PortableServer::ObjectId_var oid;
+
+ this->container_->uninstall_component ( ccmobjref.in (),
+ oid.out ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_DEBUG ((LM_DEBUG, "uninstalled the component\n"));
+ this->home_servant_->update_component_map (oid);
}
::Components::ConnectionDescriptions *
@@ -95,9 +115,11 @@ namespace CIAO
this->get_all_receptacles (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
+ /*
::Components::ConsumerDescriptions_var consumer_desc =
this->get_all_consumers (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK_RETURN (0);
+ */
::Components::EmitterDescriptions_var emitter_desc =
this->get_all_emitters (ACE_ENV_SINGLE_ARG_PARAMETER);
@@ -109,7 +131,7 @@ namespace CIAO
retv->facets (facets_desc.in ());
retv->receptacles (receptacle_desc.in ());
- retv->consumers (consumer_desc.in ());
+ // retv->consumers (consumer_desc.in ());
retv->emitters (emitter_desc.in ());
retv->publishers (publisher_desc.in ());
@@ -201,16 +223,18 @@ namespace CIAO
return retval._retn ();
}
+
::Components::ConsumerDescriptions *
Servant_Impl_Base::get_all_consumers (
- ACE_ENV_SINGLE_ARG_DECL_NOT_USED
+ ACE_ENV_SINGLE_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+
::Components::ConsumerDescriptions *tmp = 0;
- ACE_NEW_RETURN (tmp,
- ::Components::ConsumerDescriptions,
- 0);
+ ACE_NEW_THROW_EX (tmp,
+ ::Components::ConsumerDescriptions (this->consumer_table_.current_size ()),
+ CORBA::NO_MEMORY ());
::Components::ConsumerDescriptions_var retval = tmp;
@@ -221,6 +245,7 @@ namespace CIAO
iter != this->consumer_table_.end ();
++iter, ++i)
{
+ // ACE_DEBUG ((LM_DEBUG, "EXECUTING \n"));
ConsumerTable::ENTRY & entry = *iter;
retval[i] = entry.int_id_;
}
@@ -228,6 +253,7 @@ namespace CIAO
return retval._retn ();
}
+
::Components::EventConsumerBase_ptr
Servant_Impl_Base::get_consumer (
const char *sink_name
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h
index 67b736d99b2..28b0ade0998 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h
@@ -28,6 +28,8 @@
#include "CCM_EventC.h"
#include "CIAO_Server_Export.h"
#include "CCM_ComponentS.h"
+#include "CCM_ContainerS.h"
+#include "Home_Servant_Impl_Base.h"
namespace CIAO
{
@@ -47,7 +49,9 @@ namespace CIAO
public:
explicit Servant_Impl_Base (void);
- Servant_Impl_Base (Session_Container * c);
+ Servant_Impl_Base (Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
+ Session_Container * c);
virtual ~Servant_Impl_Base (void);
@@ -62,6 +66,10 @@ namespace CIAO
get_component_def (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual Components::SessionComponent_ptr
+ get_executor (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException)) = 0;
+
virtual void
configuration_complete (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException,
@@ -98,9 +106,11 @@ namespace CIAO
get_all_facets (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+
virtual ::Components::ConsumerDescriptions *
get_all_consumers (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+
virtual ::Components::EventConsumerBase_ptr
get_consumer (const char *sink_name
@@ -205,6 +215,8 @@ namespace CIAO
FacetTable facet_table_;
ConsumerTable consumer_table_;
+ Components::CCMHome_var home_;
+ Home_Servant_Impl_Base *home_servant_;
Session_Container * container_;
};
}
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp
index 4e39010461f..2277645ae55 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp
@@ -13,9 +13,14 @@ namespace CIAO
typename CONTEXT>
Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::Servant_Impl (
EXEC * exe,
+ Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
Session_Container * c
)
- : Servant_Impl_Base (c),
+ : Servant_Impl_Base (home, home_servant, c),
+ activated_ (0),
+ pre_activated_ (0),
+ post_activated_ (0),
executor_ (EXEC::_duplicate (exe))
{
}
@@ -76,6 +81,7 @@ namespace CIAO
return me->_is_equivalent (the_other.in ()
ACE_ENV_ARG_PARAMETER);
+
}
template <typename BASE_SKEL,
@@ -95,6 +101,25 @@ namespace CIAO
typename EXEC,
typename EXEC_VAR,
typename CONTEXT>
+ Components::SessionComponent_ptr
+ Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::get_executor (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ::Components::SessionComponent_var temp =
+ ::Components::SessionComponent::_narrow (
+ this->executor_.in ()
+ ACE_ENV_ARG_PARAMETER
+ );
+ ACE_CHECK;
+ return temp._retn ();
+ }
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename CONTEXT>
CORBA::Object_ptr
Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::_get_component (
ACE_ENV_SINGLE_ARG_DECL
@@ -150,7 +175,11 @@ namespace CIAO
if (! ::CORBA::is_nil (temp.in ()))
{
- temp->ciao_preactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ if (this->pre_activated_ == 0)
+ {
+ this->pre_activated_ = 1;
+ temp->ciao_preactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
}
}
@@ -172,7 +201,11 @@ namespace CIAO
if (! ::CORBA::is_nil (temp.in ()))
{
- temp->ccm_activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ if (this->activated_ == 0)
+ {
+ this->activated_ = 1;
+ temp->ccm_activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
}
}
@@ -195,7 +228,11 @@ namespace CIAO
if (! ::CORBA::is_nil (temp.in ()))
{
- temp->ciao_postactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ if (this->post_activated_ == 0)
+ {
+ this->post_activated_ = 1;
+ temp->ciao_postactivate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
}
}
@@ -203,12 +240,26 @@ namespace CIAO
typename EXEC,
typename EXEC_VAR,
typename CONTEXT>
+ CORBA::Boolean
+ Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::is_activated (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ return this->pre_activated_;
+ }
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename CONTEXT>
void
Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::_ciao_passivate (
ACE_ENV_SINGLE_ARG_DECL
)
ACE_THROW_SPEC ((CORBA::SystemException))
{
+ // @@ Jai, could you please see why this is required?
::Components::SessionComponent_var temp =
::Components::SessionComponent::_narrow (
this->executor_.in ()
@@ -217,9 +268,7 @@ namespace CIAO
ACE_CHECK;
if (! ::CORBA::is_nil (temp.in ()))
- {
- temp->ccm_passivate (ACE_ENV_SINGLE_ARG_PARAMETER);
- }
+ temp->ccm_passivate (ACE_ENV_SINGLE_ARG_PARAMETER);
}
}
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h b/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h
index 45f223f57b5..246bcdbef35 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h
@@ -47,6 +47,8 @@ namespace CIAO
{
public:
Servant_Impl (EXEC * exe,
+ Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
Session_Container * c);
virtual ~Servant_Impl (void);
@@ -66,6 +68,10 @@ namespace CIAO
_get_component (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+ virtual Components::SessionComponent_ptr
+ get_executor (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
// CIAO-specific operations.
void
@@ -85,10 +91,19 @@ namespace CIAO
_ciao_passivate (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
ACE_THROW_SPEC ((CORBA::SystemException));
+ CORBA::Boolean
+ is_activated (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
protected:
+
+ CORBA::Boolean activated_;
+ CORBA::Boolean pre_activated_;
+ CORBA::Boolean post_activated_;
+
EXEC_VAR executor_;
- CONTEXT * context_;
+ CONTEXT * context_;
};
}