summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-03-05 23:16:39 +0000
committerjai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2005-03-05 23:16:39 +0000
commit2aedf3ec7f7eaf41f7e731f869f74d6c7212ba88 (patch)
tree30914828f92d2bebbb0a4eb860a75039e2d8a71d
parent2a6e97c0db9c85be38fe93fc9b125824ac719201 (diff)
downloadATCD-2aedf3ec7f7eaf41f7e731f869f74d6c7212ba88.tar.gz
Sat Mar 5 17:10:42 2005 Jaiganesh B <jai@dre.vanderbilt.edu>
-rw-r--r--TAO/CIAO/DAnCE/ciao/CCM_Core.mpc26
-rw-r--r--TAO/CIAO/DAnCE/ciao/Container_Base.cpp46
-rw-r--r--TAO/CIAO/DAnCE/ciao/Container_Base.h35
-rw-r--r--TAO/CIAO/DAnCE/ciao/Context_Impl_T.cpp9
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.cpp73
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.h110
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.cpp26
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.h54
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.cpp112
-rw-r--r--TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.h78
-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/Port_Activator_T.cpp3
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp39
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Activator.h4
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp40
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.h14
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_T.cpp86
-rw-r--r--TAO/CIAO/DAnCE/ciao/Servant_Impl_T.h21
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Container.cpp306
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Container.h134
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Container.inl10
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.cpp44
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.h66
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.cpp298
-rw-r--r--TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.h135
27 files changed, 1833 insertions, 78 deletions
diff --git a/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc b/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
index dae88118ae6..1275bb8d2d4 100644
--- a/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
+++ b/TAO/CIAO/DAnCE/ciao/CCM_Core.mpc
@@ -8,6 +8,9 @@ project (CIAO_DnC_Client) : taolib_with_idl, valuetype, ifr_client {
idlflags += -Wb,skel_export_include=CIAO_Container_Export.h
idlflags += -Wb,skel_export_macro=CIAO_CONTAINER_Export
+ // This is necessary for MPC to pull in rules.ciao.GNU
+ includes += $(CIAO_ROOT)/DAnCE
+
dynamicflags = CIAO_CLIENT_BUILD_DLL
IDL_Files {
@@ -39,11 +42,15 @@ project (CIAO_DnC_Container) : orbsvcslib, portableserver, security, valuetype,
idlflags += -Wb,export_macro=CIAO_CONTAINER_Export
dynamicflags = CIAO_CONTAINER_BUILD_DLL
+ // This is necessary for MPC to pull in rules.ciao.GNU
+ includes += $(CIAO_ROOT)/DAnCE
+
IDL_Files {
CCM_Transaction.idl
CosPersistentState.idl
CCM_Container.idl
CCM_Container_Ex.idl
+ SwapExec.idl
}
Source_Files {
@@ -54,6 +61,7 @@ project (CIAO_DnC_Container) : orbsvcslib, portableserver, security, valuetype,
CCM_BaseS.cpp
CCM_EventS.cpp
CCM_ComponentS.cpp
+ SwapExecC.cpp
Cookies.cpp
}
@@ -64,9 +72,12 @@ project (CIAO_DnC_Container) : orbsvcslib, portableserver, security, valuetype,
project(Deployment_stub) : taolib_with_idl, valuetype, ifr_client {
sharedname = CIAO_Deployment_stub
after += CIAO_DnC_Client
-
+
libs += CIAO_DnC_Client
+ // This is necessary for MPC to pull in rules.ciao.GNU
+ includes += $(CIAO_ROOT)/DAnCE
+
idlflags += -Wb,stub_export_macro=Deployment_stub_Export
idlflags += -Wb,stub_export_include=Deployment_stub_export.h
idlflags += -Wb,skel_export_macro=Deployment_svnt_Export
@@ -93,7 +104,7 @@ project(Deployment_stub) : taolib_with_idl, valuetype, ifr_client {
// CIAO_DnC_Client library must be linked for this project.
// Please don't remove.
-project(Deployment_svnt) : taolib_with_idl, portableserver, valuetype,ifr_client {
+project(Deployment_svnt) : taolib_with_idl, portableserver, valuetype, ifr_client {
after += Deployment_stub
sharedname = CIAO_Deployment_svnt
dynamicflags = DEPLOYMENT_SVNT_BUILD_DLL
@@ -103,6 +114,9 @@ project(Deployment_svnt) : taolib_with_idl, portableserver, valuetype,ifr_client
idlflags += -Wb,skel_export_macro=Deployment_svnt_Export
idlflags += -Wb,skel_export_include=Deployment_svnt_export.h
+ // This is necessary for MPC to pull in rules.ciao.GNU
+ includes += $(CIAO_ROOT)/DAnCE
+
IDL_Files {
}
@@ -132,12 +146,16 @@ project (CIAO_DnC_Server) : orbsvcslib, portableserver, valuetype, ifr_client, u
Source_Files {
Container_Base.cpp
Container_Impl.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
}
@@ -150,9 +168,9 @@ 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 4dac6344d50..5e62c907872 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)
@@ -248,7 +259,6 @@ namespace CIAO
Deployment::ImplEntryPointNotFound,
Deployment::InstallationFailure))
{
-
HomeFactory hcreator = 0;
ServantFactory screator = 0;
@@ -394,7 +404,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);
@@ -407,6 +416,39 @@ 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::deactivate_facet (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ 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 3cbc33ee311..fd78c8247f1 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,21 @@ 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 void deactivate_facet (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ 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/Dynamic_Component_Activator.cpp b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.cpp
new file mode 100644
index 00000000000..c2798a31f8e
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.cpp
@@ -0,0 +1,73 @@
+#include "Dynamic_Component_Activator.h"
+#include "CIAO_common.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (ciao,
+ Dynamic_Component_Activator,
+ "$Id$")
+
+namespace CIAO
+{
+ Dynamic_Component_Activator::Dynamic_Component_Activator (CORBA::ORB_ptr o)
+ : orb_ (CORBA::ORB::_duplicate (o))
+ {
+ }
+
+ Dynamic_Component_Activator::~Dynamic_Component_Activator (void)
+ {
+ }
+
+ PortableServer::Servant
+ Dynamic_Component_Activator::incarnate (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest))
+ {
+ Dynamic_Component_Servant_Base* servant = 0;
+ PortableServer::ObjectId new_oid (oid);
+
+ if (this->servant_map_.find (oid, servant) == 0)
+ {
+ return servant->create (new_oid);
+ }
+
+ return 0;
+ }
+
+ void
+ Dynamic_Component_Activator::etherealize (
+ const PortableServer::ObjectId &,
+ PortableServer::POA_ptr ,
+ PortableServer::Servant ,
+ CORBA::Boolean ,
+ CORBA::Boolean
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ }
+
+ void Dynamic_Component_Activator::add_servant_map
+ (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant
+ ACE_ENV_ARG_DECL)
+ {
+ this->servant_map_.bind (oid, servant);
+ }
+
+ void Dynamic_Component_Activator::delete_servant_map
+ (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ {
+ Dynamic_Component_Servant_Base* servant = 0;
+ if (this->servant_map_.unbind (oid, servant) != 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Invalid object reference\n"));
+ return;
+ }
+
+ return;
+ }
+
+}
diff --git a/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.h b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.h
new file mode 100644
index 00000000000..5e1e86c2bfc
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Activator.h
@@ -0,0 +1,110 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Dynamic_Component_Activator.h
+ *
+ * $Id$
+ *
+ * @authors Jaiganesh Balasubramanian <jai@dre.vanderbilt.edu>
+ * Balachandran Natarajan <bala@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+#ifndef CIAO_DYNAMIC_SWAPPING_ACTIVATOR_H
+#define CIAO_DYNAMIC_SWAPPING_ACTIVATOR_H
+#include /**/ "ace/pre.h"
+
+#include "ace/Array_Base.h"
+#include "ciao/CIAO_Server_Export.h"
+#include "ciao/CCM_ContainerC.h"
+#include "ciao/Deployment_CoreC.h"
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "Dynamic_Component_Servant_Base.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/LocalObject.h"
+#include "tao/PortableServer/ServantActivatorC.h"
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4250)
+#endif /* _MSC_VER */
+
+namespace CIAO
+{
+
+ class Dynamic_Component_Servant_Base;
+ /**
+ * @class Dynamic_Component_Activator
+ *
+ * @brief Activator that is registered with the POA for facet and
+ * consumer servants.
+ *
+ */
+ class CIAO_SERVER_Export Dynamic_Component_Activator
+ : public virtual PortableServer::ServantActivator
+ , public virtual TAO_Local_RefCounted_Object
+ {
+ public:
+ Dynamic_Component_Activator (CORBA::ORB_ptr o);
+
+ virtual ~Dynamic_Component_Activator (void);
+
+ /// Template methods overridden to get callbacks.
+ /**
+ * If you would like to know the details of the following two
+ * methods, please PortableServer documentation. This is probably
+ * not the place to document what these mean.
+ */
+ PortableServer::Servant incarnate (
+ const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr poa
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ PortableServer::ForwardRequest));
+
+ void etherealize (const PortableServer::ObjectId &oid,
+ PortableServer::POA_ptr adapter,
+ PortableServer::Servant servant,
+ CORBA::Boolean cleanup_in_progress,
+ CORBA::Boolean remaining_activations
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void add_servant_map (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant
+ ACE_ENV_ARG_DECL);
+
+ void delete_servant_map (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL);
+
+ private:
+ /// Pointer to our ORB
+ CORBA::ORB_var orb_;
+
+ /// Mutex that synchronizes access to the array.
+ ACE_SYNCH_MUTEX mutex_;
+
+ ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
+ Dynamic_Component_Servant_Base *,
+ TAO_ObjectId_Hash,
+ ACE_Equal_To<PortableServer::ObjectId>,
+ ACE_SYNCH_MUTEX>
+ servant_map_;
+
+ };
+}
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif /* _MSC_VER */
+
+#include /**/ "ace/post.h"
+#endif /*CIAO_DYNAMIC_SWAPPING_ACTIVATOR_H*/
diff --git a/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.cpp b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.cpp
new file mode 100644
index 00000000000..e7a0daceadd
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.cpp
@@ -0,0 +1,26 @@
+#include "Dynamic_Component_Servant_Base.h"
+#include "CIAO_common.h"
+#include "ace/Log_Msg.h"
+#include "ace/OS_NS_string.h"
+
+ACE_RCSID (ciao,
+ Dynamic_Component_Servant_Base,
+ "$Id$")
+
+namespace CIAO
+{
+ Dynamic_Component_Servant_Base::Dynamic_Component_Servant_Base (void)
+ {
+ ACE_ASSERT (0);
+ }
+
+ Dynamic_Component_Servant_Base::Dynamic_Component_Servant_Base
+ (Session_Container * c)
+ : container_ (c)
+ {
+ }
+
+ Dynamic_Component_Servant_Base::~Dynamic_Component_Servant_Base (void)
+ {
+ }
+}
diff --git a/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.h b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.h
new file mode 100644
index 00000000000..fff68f5965d
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_Base.h
@@ -0,0 +1,54 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Dynamic_Component_Servant_Base.h
+ *
+ * $Id$
+ *
+ */
+//=============================================================================
+
+
+#ifndef CIAO_DYNAMIC_COMPONENT_SERVANT_BASE_H
+#define CIAO_DYNAMIC_COMPONENT_SERVANT_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "CCM_ComponentS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/PortableServer.h"
+#include "CIAO_Server_Export.h"
+
+namespace CIAO
+{
+ class Session_Container;
+ class CIAO_SERVER_Export Dynamic_Component_Servant_Base
+ {
+ public:
+ explicit Dynamic_Component_Servant_Base (void);
+
+ Dynamic_Component_Servant_Base (Session_Container *c);
+
+ virtual ~Dynamic_Component_Servant_Base (void);
+
+ virtual PortableServer::Servant
+ create (PortableServer::ObjectId &oid) = 0;
+
+ virtual void destroy (PortableServer::ObjectId &oid) = 0;
+
+ virtual void update_destroy_count () = 0;
+
+ protected:
+ Session_Container *container_;
+ };
+
+}
+
+#include /**/ "ace/post.h"
+
+#endif /* CIAO_DYNAMIC_COMPONENT_SERVANT_BASE_H */
diff --git a/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.cpp b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.cpp
new file mode 100644
index 00000000000..6d44811b457
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.cpp
@@ -0,0 +1,112 @@
+// $Id$
+
+#ifndef CIAO_DYNAMIC_COMPONENT_SERVANT_T_C
+#define CIAO_DYNAMIC_COMPONENT_SERVANT_T_C
+
+#include "Dynamic_Component_Servant_T.h"
+
+namespace CIAO
+{
+ template <typename COMP_SVNT,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP>
+ Dynamic_Component_Servant<COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR,
+ EXEC, EXEC_VAR, COMP>
+ ::Dynamic_Component_Servant
+ (Components::EnterpriseComponent_ptr ec,
+ Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
+ Session_Container *c)
+ :Dynamic_Component_Servant_Base (c),
+ executor_ (Components::EnterpriseComponent::_duplicate (ec)),
+ home_servant_ (home_servant),
+ home_ (Components::CCMHome::_duplicate (home)),
+ component_removed_ (0)
+ {
+ }
+
+ template <typename COMP_SVNT,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP>
+ void Dynamic_Component_Servant<COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR,
+ EXEC, EXEC_VAR, COMP>::update_destroy_count ()
+ {
+ component_removed_ = 1;
+ }
+
+ template <typename COMP_SVNT,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP>
+ Dynamic_Component_Servant<COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR,
+ EXEC, EXEC_VAR, COMP>::~Dynamic_Component_Servant (void)
+ {
+ }
+
+ template <typename COMP_SVNT,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP>
+ void Dynamic_Component_Servant
+ <COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR,
+ EXEC, EXEC_VAR, COMP>::destroy (PortableServer::ObjectId &oid)
+ {
+ COMP_SVNT *servant;
+ if (this->servant_map_.find (oid, servant) == 0)
+ {
+ servant->remove ();
+ component_removed_ = 1;
+ }
+ }
+
+ template <typename COMP_SVNT,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP>
+ PortableServer::Servant Dynamic_Component_Servant
+ <COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR,
+ EXEC, EXEC_VAR, COMP>::create (PortableServer::ObjectId &oid)
+ {
+ CIAO::Swap_Exec_var swap_exec = CIAO::Swap_Exec::_narrow
+ (this->executor_.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ::Components::EnterpriseComponent_var ciao_ec =
+ swap_exec->incarnate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ COMP_EXEC_VAR ciao_comp = COMP_EXEC::_narrow (ciao_ec.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ COMP_SVNT *svt = new COMP_SVNT(ciao_comp.in (), this->home_.in (),
+ this->home_servant_,
+ this->container_);
+
+ if (component_removed_ == 1)
+ {
+ // svt->ciao_preactivate ();
+ // svt->ciao_activate ();
+ // svt->ciao_postactivate ();
+ component_removed_ = 0;
+ }
+
+ PortableServer::ServantBase_var safe (svt);
+ this->servant_map_.bind (oid, svt);
+ return safe._retn ();
+ }
+}
+
+#endif /* CIAO_DYNAMIC_COMPONENT_SERVANT_T_C */
diff --git a/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.h b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.h
new file mode 100644
index 00000000000..9e4c8828fc8
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Dynamic_Component_Servant_T.h
@@ -0,0 +1,78 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Dynamic_Component_Servant_T.h
+ *
+ * $Id$
+ *
+ * This file contains the declaration of a mixin base class for
+ * the generated home servant class.
+ *
+ */
+//=============================================================================
+
+
+#ifndef CIAO_DYNAMIC_COMPONENT_SERVANT_T_H
+#define CIAO_DYNAMIC_COMPONENT_SERVANT_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "Dynamic_Component_Servant_Base.h"
+#include "SwapExecC.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "ace/Hash_Map_Manager_T.h"
+
+namespace CIAO
+{
+ template <typename COMP_SVNT, typename COMP_EXEC,
+ typename COMP_EXEC_VAR, typename EXEC, typename EXEC_VAR,
+ typename COMP>
+ class Dynamic_Component_Servant
+ : public virtual Dynamic_Component_Servant_Base
+ {
+ public:
+ Dynamic_Component_Servant (Components::EnterpriseComponent_ptr ec,
+ Components::CCMHome_ptr home,
+ Home_Servant_Impl_Base *home_servant,
+ Session_Container *c);
+
+ virtual ~Dynamic_Component_Servant (void);
+
+ virtual PortableServer::Servant
+ create (PortableServer::ObjectId &oid);
+
+ virtual void destroy (PortableServer::ObjectId &oid);
+
+ virtual void update_destroy_count ();
+
+ protected:
+ Components::EnterpriseComponent_var executor_;
+ Home_Servant_Impl_Base *home_servant_;
+ Components::CCMHome_var home_;
+ ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
+ COMP_SVNT *,
+ TAO_ObjectId_Hash,
+ ACE_Equal_To<PortableServer::ObjectId>,
+ ACE_SYNCH_MUTEX>
+ servant_map_;
+ int component_removed_;
+ };
+}
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "Dynamic_Component_Servant_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Dynamic_Component_Servant_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* CIAO_DYNAMIC_COMPONENT_SERVANT_T_H */
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/Port_Activator_T.cpp b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp
index f2832290731..20b083496ef 100644
--- a/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Port_Activator_T.cpp
@@ -5,6 +5,9 @@
#include "Port_Activator_T.h"
#include "tao/CORBA_String.h"
+#include "ace/OS_NS_string.h"
+
+
namespace CIAO
{
template <typename SERV,
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp
index 03899555bfd..cdd1c8d18b0 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Activator.cpp
@@ -36,6 +36,33 @@ namespace CIAO
}
}
+ bool
+ Servant_Activator::update_port_activator (
+ const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ CORBA::String_var str =
+ PortableServer::ObjectId_to_string (oid);
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX,
+ guard,
+ this->mutex_,
+ 0);
+ const unsigned int sz = this->slot_index_;
+ for (unsigned int t = 0; t != sz; ++t)
+ {
+ Port_Activator *&tmp = this->pa_[t];
+ if (ACE_OS::strcmp (tmp->name (), str.in ()) == 0)
+ {
+ delete tmp;
+ --this->slot_index_;
+ }
+ }
+ }
+ return true;
+ }
+
PortableServer::Servant
Servant_Activator::incarnate (const PortableServer::ObjectId &oid,
PortableServer::POA_ptr
@@ -78,11 +105,13 @@ namespace CIAO
}
if (ACE_OS::strcmp (tmp->name (),
str.in ()) == 0)
- // 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.
- return this->pa_[t]->activate (oid
- ACE_ENV_ARG_PARAMETER);
+ {
+ // 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.
+ return this->pa_[t]->activate (oid
+ ACE_ENV_ARG_PARAMETER);
+ }
}
}
ACE_THROW_RETURN (CORBA::OBJECT_NOT_EXIST (),
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Activator.h b/TAO/CIAO/DAnCE/ciao/Servant_Activator.h
index 27ed074b1b7..551388de004 100644
--- a/TAO/CIAO/DAnCE/ciao/Servant_Activator.h
+++ b/TAO/CIAO/DAnCE/ciao/Servant_Activator.h
@@ -57,6 +57,10 @@ namespace CIAO
virtual ~Servant_Activator (void);
+ bool update_port_activator (const PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
/// Template methods overridden to get callbacks.
/**
* If you would like to know the details of the following two
diff --git a/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp b/TAO/CIAO/DAnCE/ciao/Servant_Impl_Base.cpp
index b19a5de1f95..ee64994ae25 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,21 @@ namespace CIAO
ACE_THROW_SPEC ((CORBA::SystemException,
Components::RemoveFailure))
{
- // CIAO to-do
+ 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);
+ this->home_servant_->update_component_map (oid);
}
::Components::ConnectionDescriptions *
@@ -95,9 +113,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 +129,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 +221,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 +243,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 +251,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..7aee4159153 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
@@ -136,6 +161,29 @@ namespace CIAO
typename EXEC_VAR,
typename CONTEXT>
void
+ Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::activate_component (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ if (this->is_activated () == 0)
+ {
+ this->ciao_preactivate (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ this->ciao_activate (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+
+ this->ciao_postactivate (
+ ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+ }
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename CONTEXT>
+ void
Servant_Impl<BASE_SKEL, EXEC, EXEC_VAR, CONTEXT>::ciao_preactivate (
ACE_ENV_SINGLE_ARG_DECL
)
@@ -150,7 +198,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 +224,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 +251,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 +263,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 +291,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..e507fe8d93f 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,23 @@ 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));
+
+ void
+ activate_component (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_;
};
}
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Container.cpp b/TAO/CIAO/DAnCE/ciao/Swapping_Container.cpp
new file mode 100644
index 00000000000..18c4f4ed71c
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Container.cpp
@@ -0,0 +1,306 @@
+// $Id$
+
+#include "Container_Base.h"
+#include "Swapping_Container.h"
+#include "ace/DLL.h"
+#include "tao/Utils/PolicyList_Destroyer.h"
+#include "ace/OS_NS_stdio.h"
+
+#if !defined (__ACE_INLINE__)
+# include "Swapping_Container.inl"
+#endif /* __ACE_INLINE__ */
+
+namespace CIAO
+{
+
+ ACE_Atomic_Op <ACE_SYNCH_MUTEX, long>
+ Swapping_Container::serial_number_ (0);
+
+ Swapping_Container::Swapping_Container (CORBA::ORB_ptr o)
+ : Session_Container (o),
+ number_ (0)
+ {
+ }
+
+ Swapping_Container::~Swapping_Container ()
+ {
+ }
+
+ PortableServer::POA_ptr
+ Swapping_Container::the_home_servant_POA (void) const
+ {
+ return this->home_servant_poa_.in ();
+ }
+
+ PortableServer::POA_ptr
+ Swapping_Container::the_facet_cons_POA (void) const
+ {
+ return this->facet_cons_poa_.in ();
+ }
+
+ CORBA::Object_ptr
+ Swapping_Container::get_home_objref (PortableServer::Servant p
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ return this->the_home_servant_POA ()->servant_to_reference (p
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ void
+ Swapping_Container::deactivate_facet (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ this->the_facet_cons_POA ()->deactivate_object (oid
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ int
+ Swapping_Container::init (const char *name,
+ const CORBA::PolicyList *more_policies
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ char buffer[MAXPATHLEN];
+
+ if (name == 0)
+ {
+ this->number_ = ++Swapping_Container::serial_number_;
+ ACE_OS::sprintf (buffer, "CIAO::Swapping_Container-%ld",
+ this->number_);
+ name = buffer;
+ }
+
+ CORBA::Object_var poa_object =
+ this->orb_->resolve_initial_references("RootPOA"
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ if (CORBA::is_nil (poa_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to initialize the POA.\n"),
+ -1);
+
+ PortableServer::POA_var root_poa =
+ PortableServer::POA::_narrow (poa_object.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+
+ this->create_servant_POA (name,
+ more_policies,
+ root_poa.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+
+
+ this->create_home_servant_POA ("home servant POA",
+ more_policies,
+ root_poa.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ this->create_connections_POA (root_poa.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (-1);
+
+ return 0;
+ }
+
+ void
+ Swapping_Container::add_servant_map
+ (PortableServer::ObjectId &oid,
+ Dynamic_Component_Servant_Base* servant
+ ACE_ENV_ARG_DECL)
+ {
+ this->dsa_->add_servant_map (oid, servant);
+ }
+
+ void
+ Swapping_Container::delete_servant_map
+ (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ {
+ this->dsa_->delete_servant_map (oid);
+ }
+
+ void
+ Swapping_Container::create_home_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL)
+ {
+ CORBA::PolicyList policies (0);
+
+ if (p != 0)
+ policies = *p;
+
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+
+ this->home_servant_poa_ =
+ root->create_POA (name,
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+ }
+
+ void
+ Swapping_Container::create_connections_POA (
+ PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL)
+ {
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ TAO::Utils::PolicyList_Destroyer policies (3);
+ policies.length (3);
+
+ policies[0] =
+ root->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policies[1] =
+ root->create_request_processing_policy
+ (PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+
+ // Servant Retention Policy
+ policies[2] =
+ root->create_servant_retention_policy (PortableServer::RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->facet_cons_poa_ =
+ root->create_POA ("facet_consumer_poa",
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_NEW_THROW_EX (this->sa_,
+ Servant_Activator (this->orb_.in ()),
+ CORBA::NO_MEMORY ());
+
+ this->facet_cons_poa_->set_servant_manager (
+ this->sa_
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK;
+ }
+
+ void
+ Swapping_Container::create_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL)
+ {
+ CORBA::PolicyList policies (0);
+
+ if (p != 0)
+ policies = *p;
+
+ PortableServer::POAManager_var poa_manager =
+ root->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK;
+
+ CORBA::ULong policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_id_assignment_policy (PortableServer::USER_ID
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_request_processing_policy (
+ PortableServer::USE_SERVANT_MANAGER
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ policy_length = policies.length ();
+ policies.length (policy_length + 1);
+ policies[policy_length] =
+ root->create_servant_retention_policy (PortableServer::RETAIN
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ this->component_poa_ =
+ root->create_POA (name,
+ poa_manager.in (),
+ policies
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ ACE_NEW_THROW_EX (this->dsa_,
+ Dynamic_Component_Activator (this->orb_.in ()),
+ CORBA::NO_MEMORY ());
+
+ this->component_poa_->set_servant_manager (
+ this->dsa_
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ }
+
+ void
+ Swapping_Container::ciao_uninstall_home (Components::CCMHome_ptr homeref
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ PortableServer::POA_ptr tmp = this->home_servant_poa_.in ();
+ PortableServer::ObjectId_var oid =
+ tmp->reference_to_id (homeref
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ tmp->deactivate_object (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ CORBA::Object_ptr
+ Swapping_Container::install_servant (PortableServer::Servant p,
+ Container::OA_Type t
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ PortableServer::POA_ptr tmp = 0;
+
+ if (t == Container::Component)
+ {
+ tmp = this->home_servant_poa_.in ();
+ }
+ else
+ tmp = this->facet_cons_poa_.in ();
+
+ PortableServer::ObjectId_var oid
+ = tmp->activate_object (p
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ CORBA::Object_var objref
+ = tmp->id_to_reference (oid.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (0);
+
+ return objref._retn ();
+ }
+}
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Container.h b/TAO/CIAO/DAnCE/ciao/Swapping_Container.h
new file mode 100644
index 00000000000..7f822143845
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Container.h
@@ -0,0 +1,134 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Swapping_Container.h
+ *
+ * $Id$
+ *
+ * Header file for CIAO's Dynamic Swapping container implementations
+ *
+ * @author Jaiganesh Balasubramanian <jai@dre.vanderbilt.edu>
+ * Balachandran Natarajan <bala@dre.vanderbilt.edu>
+ */
+//=============================================================================
+
+
+#ifndef CIAO_SWAPPING_CONTAINER_H
+#define CIAO_SWAPPING_CONTAINER_H
+#include /**/ "ace/pre.h"
+
+#include "tao/ORB.h"
+#include "tao/PortableServer/PortableServer.h"
+#include "tao/PortableServer/Servant_Base.h"
+#include "ciao/CCM_ContainerC.h"
+#include "ciao/Container_Base.h"
+#include "ciao/Deployment_CoreC.h"
+#include "ciao/Dynamic_Component_Activator.h"
+#include "ciao/CIAO_Server_Export.h"
+#include "ciao/Servant_Activator.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+namespace CIAO
+{
+ class Dynamic_Component_Servant_Base;
+
+ class CIAO_SERVER_Export Swapping_Container : public Session_Container
+ {
+ public:
+
+ Swapping_Container (CORBA::ORB_ptr o);
+
+ virtual ~Swapping_Container (void);
+
+ /// Initialize the container with a name.
+ virtual int init (const char *name = 0,
+ const CORBA::PolicyList *more_policies = 0
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Object_ptr install_servant (PortableServer::Servant p,
+ Container::OA_Type t
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Object_ptr get_objref (PortableServer::Servant p
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual void ciao_uninstall_home (Components::CCMHome_ptr homeref
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual CORBA::Object_ptr get_home_objref (PortableServer::Servant p
+ 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 void deactivate_facet (PortableServer::ObjectId &oid
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ PortableServer::POA_ptr the_home_servant_POA (void) const;
+
+ PortableServer::POA_ptr the_facet_cons_POA (void) const;
+
+ private:
+
+ /// Create POA for the component.
+ void create_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL);
+
+ void create_home_servant_POA (const char *name,
+ const CORBA::PolicyList *p,
+ PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL);
+
+ void create_connections_POA (PortableServer::POA_ptr root
+ ACE_ENV_ARG_DECL);
+ protected:
+ long number_;
+
+ // @@ Jai, why should this be static?
+ static ACE_Atomic_Op <ACE_SYNCH_MUTEX, long> serial_number_;
+
+ Dynamic_Component_Activator *dsa_;
+
+ };
+}
+
+// Macro for registration of an OBV factory in the generated
+// servant class. Similar to the macro for TAO in
+// tao/ValueType/ValueFactory.h but here we take advantage of
+// the fact that we have access to the current ORB indirectly
+// through the context and container.
+#define CIAO_REGISTER_OBV_FACTORY(FACTORY, VALUETYPE) \
+ { \
+ CORBA::ValueFactory factory = new FACTORY; \
+ CORBA::ORB_ptr orb = \
+ this->context_->_ciao_the_Container ()->the_ORB (); \
+ CORBA::ValueFactory prev_factory = \
+ orb->register_value_factory ( \
+ VALUETYPE::_tao_obv_static_repository_id (), \
+ factory); \
+ CORBA::remove_ref (prev_factory); \
+ CORBA::add_ref (factory); \
+ }
+
+#if defined (__ACE_INLINE__)
+# include "Swapping_Container.inl"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+#endif /* CIAO_SWAPPING_CONTAINER_H */
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Container.inl b/TAO/CIAO/DAnCE/ciao/Swapping_Container.inl
new file mode 100644
index 00000000000..b2c00a33346
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Container.inl
@@ -0,0 +1,10 @@
+// $Id$
+
+ACE_INLINE CORBA::Object_ptr
+CIAO::Swapping_Container::get_objref (PortableServer::Servant p
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+{
+ return this->the_POA ()->servant_to_reference (p
+ ACE_ENV_ARG_PARAMETER);
+}
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.cpp b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.cpp
new file mode 100644
index 00000000000..67802096476
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.cpp
@@ -0,0 +1,44 @@
+// $Id$
+
+#include "Swapping_Servant_Home_Impl_Base.h"
+
+namespace CIAO
+{
+ Swapping_Servant_Home_Impl_Base::Swapping_Servant_Home_Impl_Base (void)
+ {
+ ACE_ASSERT (0);
+ }
+
+ Swapping_Servant_Home_Impl_Base::Swapping_Servant_Home_Impl_Base
+ (Swapping_Container * c)
+ : container_ (c)
+ {
+ }
+
+ Swapping_Servant_Home_Impl_Base::~Swapping_Servant_Home_Impl_Base (void)
+ {
+ }
+
+ // Operations for CCMHome interface.
+
+ CORBA::IRObject_ptr
+ Swapping_Servant_Home_Impl_Base::get_component_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CORBA::IRObject::_nil ());
+ }
+
+ CORBA::IRObject_ptr
+ Swapping_Servant_Home_Impl_Base::get_home_def (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (),
+ CORBA::IRObject::_nil ());
+ }
+
+}
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.h b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.h
new file mode 100644
index 00000000000..88b3033deca
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_Base.h
@@ -0,0 +1,66 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Swapping_Servant_Home_Impl_Base.h
+ *
+ * $Id$
+ *
+ */
+//=============================================================================
+
+
+#ifndef CIAO_SWAPPING_SERVANT_HOME_IMPL_BASE_H
+#define CIAO_SWAPPING_SERVANT_HOME_IMPL_BASE_H
+
+#include /**/ "ace/pre.h"
+
+#include "CCM_ComponentS.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "CIAO_Server_Export.h"
+
+namespace CIAO
+{
+ class Swapping_Container;
+
+ /**
+ * @class Swapping_Servant_Home_Impl_Base
+ *
+ */
+ // @@ Jai, why are you inheriting from "home" here? What is the
+ // point?
+ // @@ JAI, probably my class naming convention was the problem.
+ // This is a home implementation and that is why inheriting from
+ // "home".
+ //
+ class CIAO_SERVER_Export Swapping_Servant_Home_Impl_Base
+ : public virtual POA_Components::CCMHome
+ {
+ public:
+ explicit Swapping_Servant_Home_Impl_Base (void);
+
+ Swapping_Servant_Home_Impl_Base (Swapping_Container * c);
+
+ virtual ~Swapping_Servant_Home_Impl_Base (void);
+
+ // Operations for CCMHome interface.
+ virtual ::CORBA::IRObject_ptr
+ get_component_def (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ virtual ::CORBA::IRObject_ptr
+ get_home_def (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ protected:
+ Swapping_Container *container_;
+ };
+}
+
+#include /**/ "ace/post.h"
+
+#endif /* CIAO_SWAPPING_SERVANT_HOME_IMPL_BASE_H */
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.cpp b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.cpp
new file mode 100644
index 00000000000..804884efb95
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.cpp
@@ -0,0 +1,298 @@
+// $Id$
+
+#ifndef CIAO_SWAPPING_SERVANT_IMPL_T_C
+#define CIAO_SWAPPING_SERVANT_IMPL_T_C
+
+#include "Swapping_Servant_Home_Impl_T.h"
+#include "Dynamic_Component_Servant_T.h"
+
+namespace CIAO
+{
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::Swapping_Servant_Home_Impl (
+ EXEC * exe,
+ Session_Container * c, const char* obj_id, const char* repo_id)
+ : Home_Servant_Impl_Base (c),
+ executor_ (EXEC::_duplicate (exe)), obj_id_ (obj_id), repo_id_ (repo_id)
+ {
+ }
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::~Swapping_Servant_Home_Impl (void)
+ {
+ const DYNAMIC_SERVANT_MAP_ITERATOR end =
+ this->dynamic_servant_map_.end ();
+
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId (this->obj_id_);
+
+ this->container_->delete_servant_map (oid);
+
+ for (DYNAMIC_SERVANT_MAP_ITERATOR iter =
+ this->dynamic_servant_map_.begin ();
+ iter != end; ++iter)
+ {
+ // (*iter).int_id_->destroy (oid);
+ }
+ }
+
+ // Operations for CCMHome interface.
+
+ 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
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::remove_component (
+ ::Components::CCMObject_ptr
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::RemoveFailure))
+ {
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId (this->obj_id_);
+
+ Dynamic_Component_Servant_Base *servant;
+ if (this->dynamic_servant_map_.find (oid, servant) == 0)
+ {
+ servant->destroy (oid);
+ }
+ }
+
+ // Operations for keyless home interface.
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ Components::CCMObject_ptr
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::create_component (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::CreateFailure))
+ {
+ return this->create (ACE_ENV_SINGLE_ARG_PARAMETER);
+ }
+
+ // Operations for implicit home interface.
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ COMP *
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::create (
+ ACE_ENV_SINGLE_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::CreateFailure))
+ {
+ if (this->executor_.in () == 0)
+ {
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ COMP::_nil ());
+ }
+
+
+ ::Components::EnterpriseComponent_var _ciao_ec =
+ this->executor_->create (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ return this->_ciao_activate_component (_ciao_ec.in ()
+ ACE_ENV_ARG_PARAMETER);
+ }
+
+ // CIAO-specific operations.
+
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ COMP *
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::_ciao_activate_component (
+ ::Components::EnterpriseComponent_ptr ec
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ CORBA::Object_var hobj =
+ this->container_->get_home_objref (this
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ Components::CCMHome_var home =
+ Components::CCMHome::_narrow (hobj.in ()
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ PortableServer::ObjectId_var oid =
+ PortableServer::string_to_ObjectId (this->obj_id_);
+
+ CORBA::Object_var objref =
+ this->container_->generate_reference (
+ this->obj_id_,
+ this->repo_id_,
+ Container::Component
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (CORBA::Object::_nil ());
+
+ Dynamic_Component_Servant_Base *svt =
+ new Dynamic_Component_Servant
+ <COMP_SVNT, COMP_EXEC, COMP_EXEC_VAR, EXEC, EXEC_VAR, COMP>
+ (ec, home, this, this->container_);
+
+ this->container_->add_servant_map (oid, svt);
+
+ this->dynamic_servant_map_.bind (oid, svt);
+
+ COMP_VAR ho = COMP::_narrow (objref.in ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_CHECK_RETURN (COMP::_nil ());
+
+ return ho._retn ();
+ }
+
+ 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
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::update_component_map (
+ PortableServer::ObjectId &oid)
+ {
+ Dynamic_Component_Servant_Base *servant;
+ if (this->dynamic_servant_map_.find (oid, servant) == 0)
+ {
+ servant->update_destroy_count ();
+ }
+ return;
+ }
+
+ 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
+ Swapping_Servant_Home_Impl<BASE_SKEL,
+ EXEC,
+ EXEC_VAR,
+ COMP,
+ COMP_VAR,
+ COMP_EXEC,
+ COMP_EXEC_VAR,
+ COMP_SVNT>::_ciao_passivate_component (
+ COMP *comp
+ ACE_ENV_ARG_DECL
+ )
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ PortableServer::ObjectId_var oid;
+
+ this->container_->uninstall_component (comp,
+ 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;
+ }
+ }
+}
+
+#endif /* CIAO_SWAPPING_SERVANT_IMPL_T_C */
diff --git a/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.h b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.h
new file mode 100644
index 00000000000..6834c2050b9
--- /dev/null
+++ b/TAO/CIAO/DAnCE/ciao/Swapping_Servant_Home_Impl_T.h
@@ -0,0 +1,135 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Swapping_Servant_Impl_T.h
+ *
+ * $Id$
+ *
+ * This file contains the declaration of a mixin base class for
+ * the generated home servant class.
+ *
+ */
+//=============================================================================
+
+
+#ifndef CIAO_SWAPPING_SERVANT_HOME_IMPL_T_H
+#define CIAO_SWAPPING_SERVANT_HOME_IMPL_T_H
+
+#include /**/ "ace/pre.h"
+
+#include "Home_Servant_Impl_Base.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/PortableServer/Key_Adapters.h"
+#include "ace/Hash_Map_Manager_T.h"
+#include "Dynamic_Component_Servant_Base.h"
+
+namespace CIAO
+{
+ class Session_Container;
+
+ /**
+ * @class Swapping_Servant_Impl
+ *
+ * @brief Mixin base class for generated home servant.
+ *
+ * This class implements operations
+ * common to all generated home servants.
+ */
+ template <typename BASE_SKEL,
+ typename EXEC,
+ typename EXEC_VAR,
+ typename COMP,
+ typename COMP_VAR,
+ typename COMP_EXEC,
+ typename COMP_EXEC_VAR,
+ typename COMP_SVNT>
+ class Swapping_Servant_Home_Impl
+ : public virtual BASE_SKEL,
+ public virtual Home_Servant_Impl_Base,
+ public virtual PortableServer::RefCountServantBase
+ {
+ public:
+ Swapping_Servant_Home_Impl (EXEC * exe,
+ Session_Container * c,
+ const char* obj_id, const char* repo_id);
+
+ virtual ~Swapping_Servant_Home_Impl (void);
+
+ // Operations for CCMHome interface.
+
+ virtual void
+ remove_component (Components::CCMObject_ptr comp
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::RemoveFailure));
+
+ // Operations for keyless home interface.
+
+ virtual ::Components::CCMObject_ptr
+ create_component (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::CreateFailure));
+
+ // Operations for implicit home interface.
+
+ virtual COMP *
+ create (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException,
+ Components::CreateFailure));
+
+ virtual void
+ update_component_map (PortableServer::ObjectId &oid);
+
+ protected:
+ // CIAO-specific operations.
+
+ COMP *
+ _ciao_activate_component (::Components::EnterpriseComponent_ptr ec
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ void
+ _ciao_passivate_component (COMP *comp
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS)
+ ACE_THROW_SPEC ((CORBA::SystemException));
+
+ protected:
+ EXEC_VAR executor_;
+
+ ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
+ COMP_SVNT *,
+ TAO_ObjectId_Hash,
+ ACE_Equal_To<PortableServer::ObjectId>,
+ ACE_SYNCH_MUTEX>
+ component_map_;
+
+ typedef ACE_Hash_Map_Manager_Ex<PortableServer::ObjectId,
+ Dynamic_Component_Servant_Base *,
+ TAO_ObjectId_Hash,
+ ACE_Equal_To<PortableServer::ObjectId>,
+ ACE_SYNCH_MUTEX> DYNAMIC_SERVANT_MAP;
+
+ typedef DYNAMIC_SERVANT_MAP::iterator DYNAMIC_SERVANT_MAP_ITERATOR;
+ DYNAMIC_SERVANT_MAP dynamic_servant_map_;
+
+ const char* obj_id_;
+ const char* repo_id_;
+ };
+}
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "Swapping_Servant_Home_Impl_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Swapping_Servant_Home_Impl_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* CIAO_SWAPPING_SERVANT_HOME_IMPL_T_H */