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