diff options
author | jai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-03-05 23:16:39 +0000 |
---|---|---|
committer | jai <jai@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2005-03-05 23:16:39 +0000 |
commit | 2aedf3ec7f7eaf41f7e731f869f74d6c7212ba88 (patch) | |
tree | 30914828f92d2bebbb0a4eb860a75039e2d8a71d | |
parent | 2a6e97c0db9c85be38fe93fc9b125824ac719201 (diff) | |
download | ATCD-2aedf3ec7f7eaf41f7e731f869f74d6c7212ba88.tar.gz |
Sat Mar 5 17:10:42 2005 Jaiganesh B <jai@dre.vanderbilt.edu>
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 */ |