diff options
Diffstat (limited to 'TAO/CIAO/DAnCE/NodeApplicationManager')
3 files changed, 276 insertions, 134 deletions
diff --git a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.cpp b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.cpp index 0aaea995377..d54a3c7d51d 100644 --- a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.cpp +++ b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.cpp @@ -3,18 +3,20 @@ #include "NodeApplicationManager_Impl.h" #include "ace/Process.h" #include "ace/OS_NS_stdio.h" +#include "ciao/Container_Base.h" +#include "ciao/NodeApplication_Impl.h" #if !defined (__ACE_INLINE__) # include "NodeApplicationManager_Impl.inl" #endif /* __ACE_INLINE__ */ -CIAO::NodeApplicationManager_Impl::~NodeApplicationManager_Impl (void) +CIAO::NodeApplicationManager_Impl_Base::~NodeApplicationManager_Impl_Base (void) { } Deployment::NodeApplicationManager_ptr -CIAO::NodeApplicationManager_Impl::init ( +CIAO::NodeApplicationManager_Impl_Base::init ( const char *nodeapp_location, const CORBA::ULong delay, const Deployment::DeploymentPlan & plan, @@ -60,7 +62,7 @@ CIAO::NodeApplicationManager_Impl::init ( ACE_CATCHANY { ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, - "NodeApplicationManager_Impl::init\t\n"); + "NodeApplicationManager_Impl_Base::init\t\n"); ACE_RE_THROW; } ACE_ENDTRY; @@ -72,7 +74,7 @@ CIAO::NodeApplicationManager_Impl::init ( } void -CIAO::NodeApplicationManager_Impl:: +CIAO::NodeApplicationManager_Impl_Base:: parse_config_value (ACE_CString & str ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, @@ -84,128 +86,8 @@ parse_config_value (ACE_CString & str ACE_THROW ( CORBA::NO_IMPLEMENT() ); } -Deployment::NodeApplication_ptr -CIAO::NodeApplicationManager_Impl:: -create_node_application (const ACE_CString & options - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC ((CORBA::SystemException, - Deployment::ResourceNotAvailable, - Deployment::StartError, - Deployment::InvalidProperty)) -{ - Deployment::NodeApplication_var retval; - Deployment::Properties_var prop; - - ACE_NEW_THROW_EX (prop, - Deployment::Properties, - CORBA::INTERNAL ()); - ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); - - // @@ Create a new callback servant. - CIAO::NodeApplication_Callback_Impl * callback_servant = 0; - ACE_NEW_THROW_EX (callback_servant, - CIAO::NodeApplication_Callback_Impl (this->orb_.in (), - this->callback_poa_.in (), - this->objref_.in (), - prop.in ()), - CORBA::NO_MEMORY ()); - ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); - - PortableServer::ServantBase_var servant_var (callback_servant); - PortableServer::ObjectId_var cb_id - = this->callback_poa_->activate_object (callback_servant - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); - - ACE_Process node_application; - ACE_Process_Options p_options; - - ACE_TRY - { - CORBA::Object_var cb_obj = - this->callback_poa_->id_to_reference (cb_id.in () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - CIAO::NodeApplication_Callback_var cb = - CIAO::NodeApplication_Callback::_narrow (cb_obj.in () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - CORBA::String_var cb_ior = - this->orb_->object_to_string (cb.in () - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - // spawn the new NodeApplication. - p_options.command_line ("%s -k %s" - "%s", - this->nodeapp_path_.c_str (), - cb_ior.in (), - options.c_str ()); - - p_options.avoid_zombies (1); - - if (node_application.spawn (p_options) == -1) - { - if (CIAO::debug_level () > 1) - ACE_DEBUG ((LM_ERROR, "Fail to spawn a NodeApplication process\n")); - ACE_TRY_THROW (Deployment::ResourceNotAvailable ()); - } - - // wait for nodeApp to pass back its object reference. with a - // timeout value. using perform_work and stuff. - - int looping = 1; - - ACE_Time_Value timeout (this->spawn_delay_, 0); - - while (looping) - { - this->orb_->perform_work (timeout - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - retval = callback_servant->get_nodeapp_ref (); - - if (timeout == ACE_Time_Value::zero || !CORBA::is_nil (retval.in ())) - looping = 0; - } - - if (CORBA::is_nil (retval.in ())) - { - if (CIAO::debug_level () > 1) - ACE_DEBUG ((LM_ERROR, "Fail to acquire the NodeApplication object\n")); - - ACE_TRY_THROW (Deployment::ResourceNotAvailable ()); - } - - { - //ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0); - this->nodeapp_ = Deployment::NodeApplication::_duplicate (retval.in ()); - } - } - ACE_CATCHANY - { - this->callback_poa_->deactivate_object (cb_id.in ()); - ACE_TRY_CHECK; - - ACE_RE_THROW; - } - ACE_ENDTRY; - ACE_CHECK_RETURN (Deployment::NodeApplication::_nil ()); - - this->callback_poa_->deactivate_object (cb_id.in () ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (Deployment::NodeApplication::_nil ()); - - if (CIAO::debug_level () > 1) - ACE_DEBUG ((LM_DEBUG, "CIAO::NodeApplicationManager_Impl::NodeApplication spawned!\n")); - - return retval._retn (); -} - Deployment::Connections * -CIAO::NodeApplicationManager_Impl:: +CIAO::NodeApplicationManager_Impl_Base:: create_connections (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, Deployment::ResourceNotAvailable, @@ -267,7 +149,7 @@ create_connections (ACE_ENV_SINGLE_ARG_DECL) } Deployment::Application_ptr -CIAO::NodeApplicationManager_Impl:: +CIAO::NodeApplicationManager_Impl_Base:: startLaunch (const Deployment::Properties & configProperty, Deployment::Connections_out providedReference, CORBA::Boolean start @@ -289,6 +171,7 @@ startLaunch (const Deployment::Properties & configProperty, Deployment::ImplementationInfos infos; + ACE_DEBUG ((LM_DEBUG, "In NAM::startLaunch\n")); if (!(infos << (this->plan_))) { if (CIAO::debug_level () > 1) @@ -353,7 +236,7 @@ startLaunch (const Deployment::Properties & configProperty, void -CIAO::NodeApplicationManager_Impl:: +CIAO::NodeApplicationManager_Impl_Base:: destroyApplication (Deployment::Application_ptr app ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException @@ -370,3 +253,203 @@ destroyApplication (Deployment::Application_ptr app this->nodeapp_->remove (ACE_ENV_SINGLE_ARG_PARAMETER); ACE_CHECK; } + + +CIAO::NodeApplicationManager_Impl::~NodeApplicationManager_Impl (void) +{ +} + +CIAO::NodeApplicationManager_Impl:: +NodeApplicationManager_Impl (CORBA::ORB_ptr o, + PortableServer::POA_ptr p) + : NodeApplicationManager_Impl_Base (o, p) +{ +} + +Deployment::NodeApplication_ptr +CIAO::NodeApplicationManager_Impl:: +create_node_application (const ACE_CString & options + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + Deployment::ResourceNotAvailable, + Deployment::StartError, + Deployment::InvalidProperty)) +{ + Deployment::NodeApplication_var retval; + Deployment::Properties_var prop; + + ACE_DEBUG ((LM_DEBUG, "create_node_application\n")); + ACE_NEW_THROW_EX (prop, + Deployment::Properties, + CORBA::INTERNAL ()); + ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); + + // @@ Create a new callback servant. + CIAO::NodeApplication_Callback_Impl * callback_servant = 0; + ACE_NEW_THROW_EX (callback_servant, + CIAO::NodeApplication_Callback_Impl (this->orb_.in (), + this->callback_poa_.in (), + this->objref_.in (), + prop.in ()), + CORBA::NO_MEMORY ()); + ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); + + PortableServer::ServantBase_var servant_var (callback_servant); + PortableServer::ObjectId_var cb_id + = this->callback_poa_->activate_object (callback_servant + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (Deployment::NodeApplication::_nil()); + + ACE_Process node_application; + ACE_Process_Options p_options; + + ACE_TRY + { + CORBA::Object_var cb_obj = + this->callback_poa_->id_to_reference (cb_id.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CIAO::NodeApplication_Callback_var cb = + CIAO::NodeApplication_Callback::_narrow (cb_obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::String_var cb_ior = + this->orb_->object_to_string (cb.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + // spawn the new NodeApplication. + p_options.command_line ("%s -k %s" + "%s", + this->nodeapp_path_.c_str (), + cb_ior.in (), + options.c_str ()); + + p_options.avoid_zombies (1); + + if (node_application.spawn (p_options) == -1) + { + if (CIAO::debug_level () > 1) + ACE_DEBUG ((LM_ERROR, "Fail to spawn a NodeApplication process\n")); + ACE_TRY_THROW (Deployment::ResourceNotAvailable ()); + } + + // wait for nodeApp to pass back its object reference. with a + // timeout value. using perform_work and stuff. + + int looping = 1; + + ACE_Time_Value timeout (this->spawn_delay_, 0); + + while (looping) + { + this->orb_->perform_work (timeout + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + retval = callback_servant->get_nodeapp_ref (); + + if (timeout == ACE_Time_Value::zero || !CORBA::is_nil (retval.in ())) + looping = 0; + } + + if (CORBA::is_nil (retval.in ())) + { + if (CIAO::debug_level () > 1) + ACE_DEBUG ((LM_ERROR, "Fail to acquire the NodeApplication object\n")); + + ACE_TRY_THROW (Deployment::ResourceNotAvailable ()); + } + + { + //ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0); + this->nodeapp_ = Deployment::NodeApplication::_duplicate (retval.in ()); + } + } + ACE_CATCHANY + { + this->callback_poa_->deactivate_object (cb_id.in ()); + ACE_TRY_CHECK; + + ACE_RE_THROW; + } + ACE_ENDTRY; + ACE_CHECK_RETURN (Deployment::NodeApplication::_nil ()); + + this->callback_poa_->deactivate_object (cb_id.in () ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (Deployment::NodeApplication::_nil ()); + + if (CIAO::debug_level () > 1) + ACE_DEBUG ((LM_DEBUG, "CIAO::NodeApplicationManager_Impl::NodeApplication spawned!\n")); + + return retval._retn (); +} + +CIAO::Static_NodeApplicationManager_Impl::~Static_NodeApplicationManager_Impl (void) +{ +} + +CIAO::Static_NodeApplicationManager_Impl:: +Static_NodeApplicationManager_Impl (CORBA::ORB_ptr o, + PortableServer::POA_ptr p, + Static_Config_EntryPoints_Maps* static_config_entrypoints_maps) + : NodeApplicationManager_Impl_Base (o, p), + static_config_entrypoints_maps_ (static_config_entrypoints_maps) +{ +} + +Deployment::NodeApplication_ptr +CIAO::Static_NodeApplicationManager_Impl:: +create_node_application (const ACE_CString & options + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + Deployment::ResourceNotAvailable, + Deployment::StartError, + Deployment::InvalidProperty)) +{ + CIAO::Static_NodeApplication_Impl *nodeapp_servant; + + ACE_DEBUG ((LM_DEBUG, "create_static_node_application\n")); + + ACE_NEW_RETURN (nodeapp_servant, + CIAO::Static_NodeApplication_Impl (orb_.in (), + poa_.in (), + this->static_config_entrypoints_maps_), + Deployment::NodeApplication::_nil () + ); + if (nodeapp_servant->init (ACE_ENV_SINGLE_ARG_PARAMETER)) + { + ACE_DEBUG ((LM_DEBUG, "NodeApplication Failed on creating and\ + initializing the session container!")); + return Deployment::NodeApplication::_nil (); + } + ACE_TRY_CHECK; + + // CONFIGURING NodeApplication + PortableServer::ObjectId_var nodeapp_oid + = poa_->activate_object (nodeapp_servant + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + CORBA::Object_var + obj = poa_->id_to_reference (nodeapp_oid.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + Deployment::NodeApplication_var nodeapp_obj = + Deployment::NodeApplication::_narrow (obj.in () + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + if (CORBA::is_nil (nodeapp_obj.in ())) + { + ACE_ERROR ((LM_ERROR, "Unable to activate NodeApplication object\n")); + return Deployment::NodeApplication::_nil (); + } + + this->nodeapp_ = Deployment::NodeApplication::_duplicate (nodeapp_obj.in ()); + + return nodeapp_obj._retn (); +} diff --git a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.h b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.h index f6ad72f4a79..58d4bdbbef3 100644 --- a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.h +++ b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.h @@ -34,13 +34,13 @@ namespace CIAO /** * @class NodeApplicationManager_Impl */ - class CIAO_NAM_Export NodeApplicationManager_Impl + class CIAO_NAM_Export NodeApplicationManager_Impl_Base : public virtual POA_Deployment::NodeApplicationManager, public virtual PortableServer::RefCountServantBase { public: /// Constructor - NodeApplicationManager_Impl (CORBA::ORB_ptr o, + NodeApplicationManager_Impl_Base (CORBA::ORB_ptr o, PortableServer::POA_ptr p); /*=========================================================== @@ -102,7 +102,7 @@ namespace CIAO protected: /// Destructor - virtual ~NodeApplicationManager_Impl (void); + virtual ~NodeApplicationManager_Impl_Base (void); // Internal help function to create new NodeApplicationProcess virtual Deployment::NodeApplication_ptr @@ -111,7 +111,7 @@ namespace CIAO ACE_THROW_SPEC ((CORBA::SystemException, Deployment::ResourceNotAvailable, Deployment::StartError, - Deployment::InvalidProperty)); + Deployment::InvalidProperty))=0; // Helper function to get the connection. virtual Deployment::Connections * @@ -173,6 +173,65 @@ namespace CIAO // Synchronize access to the object set. TAO_SYNCH_MUTEX lock_; }; + + /** + * @class NodeApplicationManager_Impl + */ + class NodeApplicationManager_Impl + : public virtual NodeApplicationManager_Impl_Base + { + public: + /// Constructor + NodeApplicationManager_Impl (CORBA::ORB_ptr o, + PortableServer::POA_ptr p); + + protected: + /// Destructor + virtual ~NodeApplicationManager_Impl (void); + + // Internal help function to create new NodeApplicationProcess + // Here we override it to create an in-process NodeApplication object + virtual Deployment::NodeApplication_ptr + create_node_application (const ACE_CString & options + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Deployment::ResourceNotAvailable, + Deployment::StartError, + Deployment::InvalidProperty)); + }; + + struct Static_Config_EntryPoints_Maps; + + /** + * @class Static_NodeApplicationManager_Impl + */ + class Static_NodeApplicationManager_Impl + : public virtual NodeApplicationManager_Impl_Base + { + public: + /// Constructor + Static_NodeApplicationManager_Impl (CORBA::ORB_ptr o, + PortableServer::POA_ptr p, + Static_Config_EntryPoints_Maps* static_config_entrypoints_maps); + + protected: + /// Destructor + virtual ~Static_NodeApplicationManager_Impl (void); + + // Internal help function to create new NodeApplicationProcess + // Here we override it to create an in-process NodeApplication object + virtual Deployment::NodeApplication_ptr + create_node_application (const ACE_CString & options + ACE_ENV_ARG_DECL_WITH_DEFAULTS) + ACE_THROW_SPEC ((CORBA::SystemException, + Deployment::ResourceNotAvailable, + Deployment::StartError, + Deployment::InvalidProperty)); + + Static_Config_EntryPoints_Maps* static_config_entrypoints_maps_; + + }; + } #if defined (__ACE_INLINE__) diff --git a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.inl b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.inl index 24908a047a4..5a29debbb53 100644 --- a/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.inl +++ b/TAO/CIAO/DAnCE/NodeApplicationManager/NodeApplicationManager_Impl.inl @@ -2,8 +2,8 @@ // $Id$ ACE_INLINE -CIAO::NodeApplicationManager_Impl:: -NodeApplicationManager_Impl (CORBA::ORB_ptr o, +CIAO::NodeApplicationManager_Impl_Base:: +NodeApplicationManager_Impl_Base (CORBA::ORB_ptr o, PortableServer::POA_ptr p) : orb_ (CORBA::ORB::_duplicate (o)), poa_ (PortableServer::POA::_duplicate (p)), @@ -20,7 +20,7 @@ NodeApplicationManager_Impl (CORBA::ORB_ptr o, ACE_INLINE Deployment::NodeApplicationManager_ptr -CIAO::NodeApplicationManager_Impl::get_nodeapp_manager (void) +CIAO::NodeApplicationManager_Impl_Base::get_nodeapp_manager (void) { return this->objref_.in (); } |