diff options
Diffstat (limited to 'TAO/tao/Strategies')
-rw-r--r-- | TAO/tao/Strategies/OC_Endpoint_Selector_Factory.cpp | 40 | ||||
-rw-r--r-- | TAO/tao/Strategies/OC_Endpoint_Selector_Factory.h | 3 | ||||
-rw-r--r-- | TAO/tao/Strategies/Strategies_ORBInitializer.cpp | 43 | ||||
-rw-r--r-- | TAO/tao/Strategies/Strategies_ORBInitializer.h | 57 |
4 files changed, 141 insertions, 2 deletions
diff --git a/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.cpp b/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.cpp index eecb8e70779..6dec01899b6 100644 --- a/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.cpp +++ b/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.cpp @@ -2,6 +2,9 @@ #include "tao/Strategies/OC_Endpoint_Selector_Factory.h" #include "tao/Strategies/Optimized_Connection_Endpoint_Selector.h" +#include "tao/Strategies/Strategies_ORBInitializer.h" +#include "tao/ORBInitializer_Registry.h" +#include "tao/PI/ORBInitInfo.h" #include "ace/Log_Msg.h" #include "tao/ORB_Core.h" #include "ace/OS.h" @@ -27,7 +30,6 @@ TAO_OC_Endpoint_Selector_Factory::init (int argc, ACE_TCHAR *argv[]) { ACE_Time_Value timeout(0,0); - TAO_ORB_Core::set_endpoint_selector_factory ("OC_Endpoint_Selector_Factory"); for (int count = 0; count < argc; count++) { if ((ACE_OS::strcasecmp (argv[count], @@ -40,12 +42,48 @@ TAO_OC_Endpoint_Selector_Factory::init (int argc, ACE_TCHAR *argv[]) } } + if (this->register_orb_initializer () == -1) + return -1; + ACE_NEW_RETURN (this->oc_endpoint_selector_, TAO_Optimized_Connection_Endpoint_Selector(timeout), -1); return 0; } +int +TAO_OC_Endpoint_Selector_Factory::register_orb_initializer (void) +{ + // Register the ORB initializer. + try + { + PortableInterceptor::ORBInitializer_ptr temp_orb_initializer = + PortableInterceptor::ORBInitializer::_nil (); + + /// Register the RTCORBA ORBInitializer. + ACE_NEW_THROW_EX (temp_orb_initializer, + TAO_Strategies_ORBInitializer, + CORBA::NO_MEMORY ( + CORBA::SystemException::_tao_minor_code ( + TAO::VMCID, + ENOMEM), + CORBA::COMPLETED_NO)); + + PortableInterceptor::ORBInitializer_var orb_initializer; + orb_initializer = temp_orb_initializer; + + PortableInterceptor::register_orb_initializer (orb_initializer.in ()); + } + catch (const ::CORBA::Exception& ex) + { + ex._tao_print_exception ( + "Unexpected exception caught while " + "initializing the Strategies library"); + return -1; + } + + return 0; +} TAO_Invocation_Endpoint_Selector * TAO_OC_Endpoint_Selector_Factory::get_selector (void) diff --git a/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.h b/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.h index de45e4fdc5e..d5e25dca8d6 100644 --- a/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.h +++ b/TAO/tao/Strategies/OC_Endpoint_Selector_Factory.h @@ -61,7 +61,6 @@ public: /// Destructor. virtual ~TAO_OC_Endpoint_Selector_Factory (void); - virtual int init (int argc, ACE_TCHAR *argv[]); /// Get an Invocation's endpoint selection strategy and @@ -73,6 +72,8 @@ protected: /// returned by this factory TAO_Optimized_Connection_Endpoint_Selector *oc_endpoint_selector_; + + int register_orb_initializer (void); }; diff --git a/TAO/tao/Strategies/Strategies_ORBInitializer.cpp b/TAO/tao/Strategies/Strategies_ORBInitializer.cpp new file mode 100644 index 00000000000..6aa63c6b810 --- /dev/null +++ b/TAO/tao/Strategies/Strategies_ORBInitializer.cpp @@ -0,0 +1,43 @@ +#include "tao/Strategies/Strategies_ORBInitializer.h" + +ACE_RCSID (Strategies, + Strategies_ORBInitializer, + "$Id$") + +#include "tao/Exception.h" +#include "tao/ORB_Core.h" +#include "tao/PI/ORBInitInfo.h" +#include "tao/debug.h" + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +void +TAO_Strategies_ORBInitializer::pre_init (PortableInterceptor::ORBInitInfo_ptr info) +{ + // Narrow to a TAO_ORBInitInfo object to get access to the + // orb_core() TAO extension. + TAO_ORBInitInfo_var tao_info = TAO_ORBInitInfo::_narrow (info); + + if (CORBA::is_nil (tao_info.in ())) + { + if (TAO_debug_level > 0) + ACE_ERROR ((LM_ERROR, + "(%P|%t) TAO_Strategies_ORBInitializer::pre_init:\n" + "(%P|%t) Unable to narrow " + "\"PortableInterceptor::ORBInitInfo_ptr\" to\n" + "(%P|%t) \"TAO_ORBInitInfo *.\"\n")); + + throw ::CORBA::INTERNAL (); + } + + // Make sure we get the correct endpoint selector + tao_info->orb_core ()->orb_params ()->endpoint_selector_factory_name ("OC_Endpoint_Selector_Factory"); +} + +void +TAO_Strategies_ORBInitializer::post_init (PortableInterceptor::ORBInitInfo_ptr) +{ +} + +TAO_END_VERSIONED_NAMESPACE_DECL + diff --git a/TAO/tao/Strategies/Strategies_ORBInitializer.h b/TAO/tao/Strategies/Strategies_ORBInitializer.h new file mode 100644 index 00000000000..e7267eddefd --- /dev/null +++ b/TAO/tao/Strategies/Strategies_ORBInitializer.h @@ -0,0 +1,57 @@ +// -*- C++ -*- + +//============================================================================= +/** + * @file Strategies_ORBInitializer.h + * + * $Id$ + * + * @author Johnny Willemsen <jwillemsen@remedy.nl> + */ +//============================================================================= + + +#ifndef TAO_STRATEGIES_ORB_INITIALIZER_H +#define TAO_STRATEGIES_ORB_INITIALIZER_H + +#include /**/ "ace/pre.h" + +#include "tao/orbconf.h" + +#include "tao/Strategies/strategies_export.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "tao/PI/PI.h" +#include "tao/LocalObject.h" + +// This is to remove "inherits via dominance" warnings from MSVC. +// MSVC is being a little too paranoid. +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable:4250) +#endif /* _MSC_VER */ + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +class TAO_Strategies_ORBInitializer + : public virtual PortableInterceptor::ORBInitializer + , public virtual TAO_Local_RefCounted_Object +{ +public: + virtual void pre_init (PortableInterceptor::ORBInitInfo_ptr info); + + virtual void post_init (PortableInterceptor::ORBInitInfo_ptr info); +}; + +TAO_END_VERSIONED_NAMESPACE_DECL + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif /* _MSC_VER */ + +#include /**/ "ace/post.h" + +#endif /* TAO_STRATEGIES_ORB_INITIALIZER_H */ |