diff options
Diffstat (limited to 'TAO/tao/ORB_Core.cpp')
-rw-r--r-- | TAO/tao/ORB_Core.cpp | 3149 |
1 files changed, 0 insertions, 3149 deletions
diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp deleted file mode 100644 index 59933fb6d27..00000000000 --- a/TAO/tao/ORB_Core.cpp +++ /dev/null @@ -1,3149 +0,0 @@ -// $Id$ - -#include "ORB_Core.h" -#include "ORB_Table.h" -#include "TAO_Internal.h" -#include "default_server.h" -#include "Profile.h" -#include "Stub.h" -#include "LF_Follower.h" -#include "Leader_Follower.h" -#include "LF_Event_Loop_Thread_Helper.h" -#include "Connector_Registry.h" -#include "Sync_Strategies.h" -#include "Object_Loader.h" -#include "ObjectIdListC.h" -#include "BiDir_Adapter.h" -#include "Collocation_Resolver.h" -#include "Flushing_Strategy.h" -#include "Request_Dispatcher.h" -#include "Stub_Factory.h" -#include "Thread_Lane_Resources.h" -#include "Thread_Lane_Resources_Manager.h" -#include "TSS_Resources.h" -#include "Protocols_Hooks.h" -#include "IORInterceptor_Adapter.h" -#include "IORInterceptor_Adapter_Factory.h" -#include "debug.h" -#include "TAOC.h" -#include "Endpoint_Selector_Factory.h" -#include "Client_Strategy_Factory.h" -#include "Adapter_Factory.h" -#include "Adapter.h" -#include "GUIResource_Factory.h" -#include "PolicyFactory_Registry_Adapter.h" -#include "PolicyFactory_Registry_Factory.h" -#include "ORBInitializer_Registry_Adapter.h" - -#if (TAO_HAS_CORBA_MESSAGING == 1) -#include "Policy_Manager.h" -#include "Policy_Current.h" -#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ - -#if (TAO_HAS_INTERCEPTORS == 1) -# include "ClientRequestInfo.h" -#endif /* TAO_HAS_INTERCEPTORS == 1 */ - -#include "ace/Reactor.h" -#include "ace/Dynamic_Service.h" -#include "ace/Arg_Shifter.h" -#include "ace/Argv_Type_Converter.h" -#include "ace/Static_Object_Lock.h" - - -#if !defined (ACE_LACKS_IOSTREAM_TOTALLY) -// Needed to set ACE_LOG_MSG::msg_ostream() -// FUZZ: disable check_for_streams_include -# include "ace/streams.h" -#endif /* !ACE_LACKS_IOSTREAM_TOTALLY */ - -#include "ace/OS_NS_strings.h" -#include "ace/OS_NS_string.h" - -#if !defined (__ACE_INLINE__) -# include "ORB_Core.i" -#endif /* ! __ACE_INLINE__ */ - -ACE_RCSID (tao, - ORB_Core, - "$Id$") - -// **************************************************************** - -CORBA::Environment& -TAO_default_environment (void) -{ - return *TAO_TSS_RESOURCES::instance ()->default_environment_; -} - -// **************************************************************** - -// Initialize instance_ to 0, since this is what we test for in the call -// to instance (). Note that this does not require a constructor call, so -// it is always initialized by the time that instance () can be called. -TAO_ORB_Core_Static_Resources* TAO_ORB_Core_Static_Resources::instance_ = 0; - -// Force an instance to be created at module initialization time, -// since we do not want to worry about double checked locking and -// the race condition to initialize the lock. -TAO_ORB_Core_Static_Resources* TAO_ORB_Core_Static_Resources::initialization_reference_ = - TAO_ORB_Core_Static_Resources::instance (); - -TAO_ORB_Core_Static_Resources* -TAO_ORB_Core_Static_Resources::instance (void) -{ - if (TAO_ORB_Core_Static_Resources::instance_ == 0) - { - // This new is never freed on purpose. The data specified by - // it needs to be around for the last shared library that references - // this class. This could occur in a destructor in a shared library - // that is unloaded after this one. One solution to avoid this - // harmless memory leak would be to use reference counting. - ACE_NEW_RETURN (TAO_ORB_Core_Static_Resources::instance_, - TAO_ORB_Core_Static_Resources (), - 0); - } - - return TAO_ORB_Core_Static_Resources::instance_; -} - -TAO_ORB_Core_Static_Resources::TAO_ORB_Core_Static_Resources (void) - : sync_scope_hook_ (0), - protocols_hooks_name_ ("Protocols_Hooks"), - timeout_hook_ (0), - connection_timeout_hook_ (0), - endpoint_selector_factory_name_ ("Default_Endpoint_Selector_Factory"), - thread_lane_resources_manager_factory_name_ ("Default_Thread_Lane_Resources_Manager_Factory"), - collocation_resolver_name_ ("Default_Collocation_Resolver"), - stub_factory_name_ ("Default_Stub_Factory"), - resource_factory_name_ ("Resource_Factory"), - dynamic_adapter_name_ ("Dynamic_Adapter"), - ifr_client_adapter_name_ ("IFR_Client_Adapter"), - typecodefactory_adapter_name_ ("TypeCodeFactory_Adapter"), - iorinterceptor_adapter_factory_name_ ("IORInterceptor_Adapter_Factory"), - valuetype_adapter_name_ ("Valuetype_Adapter"), - poa_factory_name_ ("TAO_Object_Adapter_Factory"), - poa_factory_directive_ (ACE_DYNAMIC_SERVICE_DIRECTIVE("TAO_Object_Adapter_Factory", "TAO_PortableServer", "_make_TAO_Object_Adapter_Factory", "")) -{ -} - -// **************************************************************** - -TAO_ORB_Core::TAO_ORB_Core (const char *orbid) - : protocols_hooks_ (0), - lock_ (), - thread_lane_resources_manager_ (0), - collocation_resolver_ (0), - stub_factory_ (0), - protocol_factories_ (0), - implrepo_service_ (CORBA::Object::_nil ()), - use_implrepo_ (0), - imr_endpoints_in_ior_ (1), - typecode_factory_ (CORBA::Object::_nil ()), - codec_factory_ (CORBA::Object::_nil ()), - dynany_factory_ (CORBA::Object::_nil ()), - ior_manip_factory_ (CORBA::Object::_nil ()), - ior_table_ (CORBA::Object::_nil ()), - orb_ (CORBA::ORB::_nil ()), - root_poa_ (), - orb_params_ (), - init_ref_map_ (TAO_DEFAULT_OBJECT_REF_TABLE_SIZE), - object_ref_table_ (), - object_key_table_ (), - orbid_ (ACE_OS::strdup (orbid ? orbid : "")), - resource_factory_ (0), - client_factory_ (0), - server_factory_ (0), - opt_for_collocation_ (1), - use_global_collocation_ (1), - collocation_strategy_ (THRU_POA), - -#if (TAO_HAS_CORBA_MESSAGING == 1) - - policy_manager_ (0), - default_policies_ (0), - policy_current_ (0), - -#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ - - poa_current_ (), - adapter_registry_ (this), - poa_adapter_ (0), - tm_ (), - tss_cleanup_funcs_ (), - tss_resources_ (), - has_shutdown_ (1), // Start the ORB in a "shutdown" state. Only - // after CORBA::ORB_init() is called will the - // ORB no longer be shutdown. This does not - // mean that the ORB can be reinitialized. It - // can only be initialized once. - thread_per_connection_use_timeout_ (1), - open_lock_ (), - endpoint_selector_factory_ (0), -#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) - eager_buffering_sync_strategy_ (0), - delayed_buffering_sync_strategy_ (0), -#endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ - transport_sync_strategy_ (0), - refcount_ (1), - policy_factory_registry_ (0), - orbinitializer_registry_ (0), -#if (TAO_HAS_INTERCEPTORS == 1) - pi_current_ (0), - client_request_interceptors_ (), - server_request_interceptors_ (), -#endif /* TAO_HAS_INTERCEPTORS == 1 */ - ior_interceptor_adapter_ (0), - valuetype_adapter_ (0), - parser_registry_ (), - bidir_adapter_ (0), - bidir_giop_policy_ (0), - flushing_strategy_ (0), - codeset_manager_ (0) -{ -#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) - - ACE_NEW (this->eager_buffering_sync_strategy_, - TAO_Eager_Buffering_Sync_Strategy); - - ACE_NEW (this->delayed_buffering_sync_strategy_, - TAO_Delayed_Buffering_Sync_Strategy); - -#endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ - -#if (TAO_HAS_CORBA_MESSAGING == 1) - - ACE_NEW (this->policy_manager_, - TAO_Policy_Manager); - - ACE_NEW (this->default_policies_, - TAO_Policy_Set (TAO_POLICY_ORB_SCOPE)); - - ACE_NEW (this->policy_current_, - TAO_Policy_Current); - -#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ - - ACE_NEW (this->transport_sync_strategy_, - TAO_Transport_Sync_Strategy); - - // Initialize the default request dispatcher. - ACE_NEW (this->request_dispatcher_, - TAO_Request_Dispatcher); -} - -TAO_ORB_Core::~TAO_ORB_Core (void) -{ - delete this->thread_lane_resources_manager_; - - delete this->flushing_strategy_; - - ACE_OS::free (this->orbid_); - -#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) - - delete this->eager_buffering_sync_strategy_; - delete this->delayed_buffering_sync_strategy_; - -#endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ - -#if (TAO_HAS_CORBA_MESSAGING == 1) - - CORBA::release (this->policy_manager_); - delete this->default_policies_; - CORBA::release (this->policy_current_); - -#endif /* TAO_HAS_CORBA_MESSAGING == 1 */ - - delete this->transport_sync_strategy_; - - delete this->request_dispatcher_; - - delete this->policy_factory_registry_; - - // Don't delete, is a process wide singleton shared by all orbs - orbinitializer_registry_ = 0; - - CORBA::release (this->orb_); -} - -int -TAO_ORB_Core::init (int &argc, char *argv[] ACE_ENV_ARG_DECL) -{ - // Right now, this code expects to begin parsing in argv[1] rather - // than argv[0]. I don't think that's wise. I think we need to - // change that convention to argv[0] and let the initializing code - // make any necessary shifts. - // - // Parse arguments to the ORB. Typically the ORB is passed - // arguments straight from the command line, so we will simply pass - // through them and respond to the ones we understand and ignore - // those we don't. - // - // In some instances, we may actually build another vector of - // arguments and stash it for use initializing other components such - // as the RootPOA. - - // @@ GIOPLite should be an alternative ORB Messaging protocols, fredk - // int giop_lite = 0; - - bool use_ior = true; - int cdr_tradeoff = ACE_DEFAULT_CDR_MEMCPY_TRADEOFF; - - // The following things should be changed to use the ACE_Env_Value<> - // template sometime. - - // Name Service port use for Multicast - unsigned short ns_port = 0; - - // Trading Service port used for Multicast - unsigned short ts_port = 0; - - // Implementation Repository Service port #. - unsigned short ir_port = 0; - - // Buffer sizes for kernel socket buffers - // @@ should be a default defined for each protocol implementation? - // since we may have protocols loaded which use shared memory of - // some form, fredk - long rcv_sock_size = -1; - long snd_sock_size = -1; - - // Use TCP_NODELAY. - int nodelay = 1; - - // Use dotted decimal addresses - // @@ This option will be treated as a suggestion to each loaded - // protocol to use a character representation for the numeric - // address, otherwise use a logical name. fredk -#if (TAO_USE_DOTTED_DECIMAL_ADDRESSES == 1) - int dotted_decimal_addresses = 1; -#else - int dotted_decimal_addresses = 0; -#endif /* TAO_USE_DOTTED_DECIMAL_ADDRESSES */ - -#if defined (TAO_STD_PROFILE_COMPONENTS) - int std_profile_components = 1; -#else - int std_profile_components = 0; -#endif /* TAO_STD_PROFILE_COMPONENTS */ - - int linger = -1; - - // Copy command line parameter not to use original. - ACE_Argv_Type_Converter command_line (argc, argv); - - ACE_Arg_Shifter arg_shifter (command_line.get_argc (), - command_line.get_TCHAR_argv ()); - - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - monitor, - this->lock_, - -1); - - // Pick up the value of the use_implrepo_ flag from an environment variable - // called "TAO_USE_IMR". Do it here so that it can be overridden by - // the "-ORBUseIMR" command line argument. - // - char* const use_IMR_env_var_value = ACE_OS::getenv ("TAO_USE_IMR") ; - if (use_IMR_env_var_value != 0) - { - this->use_implrepo_ = ACE_OS::atoi (use_IMR_env_var_value) ; - } - - - while (arg_shifter.is_anything_left ()) - { - const ACE_TCHAR *current_arg = 0; - - //////////////////////////////////////////////////////////////// - // begin with the 'parameterless' flags // - //////////////////////////////////////////////////////////////// - if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBDottedDecimalAddresses")))) - { - // Use dotted decimal addresses - // @@ this should be renamed. See above comment. fredk - dotted_decimal_addresses = - ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBNameServicePort")))) - { - // Specify the port number for the NameService. - // Unrelated to ORB Protocols, this is used for multicast. - - ns_port = (CORBA::UShort) ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBMulticastDiscoveryEndpoint")))) - { - // Specify mcast address:port@network_interface for the - // Naming Service Multicast Discovery Protocol. - // If there is no colon, its only the port no. - // If there is a '@' also, it means that the network - // interface name is specified. - this->orb_params ()->mcast_discovery_endpoint (ACE_TEXT_ALWAYS_CHAR(current_arg)); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBNodelay")))) - { - // Use TCP_NODELAY or not. - nodelay = - ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBTradingServicePort")))) - { - // Specify the port number for the NameService. - - ts_port = (CORBA::UShort) ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBImplRepoServicePort")))) - { - // Specify the multicast port number for the Implementation - // Repository. - ir_port = (CORBA::UShort) ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBRcvSock")))) - { - // @@ All protocol implementation may not use sockets, so - // this can either be a generic I/O Buffer size or - // Buffer info can be a per protocol specification, fredk - - // Specify the size of the socket's receive buffer - - rcv_sock_size = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBSndSock")))) - { - // @@ All protocol implementation may not use sockets, so - // this can either be a generic I/O Buffer size or - // Buffer info can be a per protocol specification, fredk - - // Specify the size of the socket's send buffer - snd_sock_size = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBObjRefStyle")))) - { - // Specifies the style of printed objrefs: URL or IOR - // - // BEGIN COMMENTS FROM IIOP-1.4 On Win32, we should be - // collecting information from the Registry such as what - // ORBs are configured, specific configuration details like - // whether they generate IOR or URL style stringified - // objrefs and which addresses they listen to (e.g. allowing - // multihomed hosts to implement firewalls), user-meaningful - // orb names (they will normally indicate domains), and - // more. - // - // On UNIX, we should collect that from some private config - // file. - // - // Instead, this just treats the "internet" ORB name - // specially and makes it always use URL-style stringified - // objrefs, where the hostname and TCP port number are - // explicit (and the whole objref is readable by mortals). - // BEGIN COMMENTS FROM IIOP-1.4 - const ACE_TCHAR *opt = current_arg; - if (ACE_OS::strcasecmp (opt, ACE_TEXT("URL")) == 0) - use_ior = false; - else if (ACE_OS::strcasecmp (opt, ACE_TEXT("IOR")) == 0) - use_ior = true; - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBCollocationStrategy")))) - { - // Specify which collocation policy we want to use. - const ACE_TCHAR *opt = current_arg; - if (ACE_OS::strcasecmp (opt, ACE_TEXT("thru_poa")) == 0) - this->collocation_strategy_ = THRU_POA; - else if (ACE_OS::strcasecmp (opt, ACE_TEXT("direct")) == 0) - this->collocation_strategy_ = DIRECT; - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBCollocation")))) - { - // Specify whether we want to optimize against collocation - // objects. Valid arguments are: "yes" and "no". - // Default is yes. - - int yes_implies_global = 0; - - const ACE_TCHAR *opt = current_arg; - if (ACE_OS::strcasecmp (opt, ACE_TEXT("YES")) == 0) - { - yes_implies_global = 1; - ACE_DEBUG ((LM_WARNING, - ACE_TEXT ("WARNING: using '-ORBCollocation YES' is obsolete ") - ACE_TEXT ("and implies '-ORBCollocation global'") - ACE_TEXT (" Please use '-ORBCollocation global' instead.\n"))); - } - - if (yes_implies_global || - ACE_OS::strcasecmp (opt, ACE_TEXT("global")) == 0) - { - this->opt_for_collocation_ = 1; - this->use_global_collocation_ = 1; - } - else if (ACE_OS::strcasecmp (opt, ACE_TEXT("NO")) == 0) - { - this->opt_for_collocation_ = 0; - this->use_global_collocation_ = 0; - } - else if (ACE_OS::strcasecmp (opt, ACE_TEXT("per-orb")) == 0) - { - this->opt_for_collocation_ = 1; - this->use_global_collocation_ = 0; - } - else - { - ACE_DEBUG ((LM_WARNING, - ACE_TEXT ("WARNING: Unknown option to ") - ACE_TEXT ("'-ORBCollocation': %s\n"), opt)); - } - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBGlobalCollocation")))) - // Specify whether we want to use collocation across ORBs; - // i.e. all the ORBs in the same address space use collocated - // calls. - { - ACE_DEBUG ((LM_WARNING, - ACE_TEXT ("WARNING: -ORBGlobalCollocation option is obsolete.") - ACE_TEXT (" Please use '-ORBCollocation global/per-orb/no'") - ACE_TEXT ("instead.\n"))); - - const ACE_TCHAR *opt = current_arg; - if (ACE_OS::strcasecmp (opt, ACE_TEXT("YES")) == 0) - this->use_global_collocation_ = 1; - else if (ACE_OS::strcasecmp (opt, ACE_TEXT("NO")) == 0) - this->use_global_collocation_ = 0; - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBPreferredInterfaces")))) - { - if (this->orb_params ()->preferred_interfaces ( - ACE_TEXT_ALWAYS_CHAR (current_arg)) == false) - ACE_THROW_RETURN (CORBA::INTERNAL ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBEnforcePreferredInterfaces")))) - { - if (ACE_OS::strcasecmp (current_arg, - ACE_TEXT("YES")) == 0) - this->orb_params ()->enforce_pref_interfaces (true); - else if (ACE_OS::strcasecmp (current_arg, - ACE_TEXT("NO")) == 0) - this->orb_params ()->enforce_pref_interfaces (false); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBCDRTradeoff")))) - { - cdr_tradeoff = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - - // A new <ObjectID>:<IOR> mapping has been specified. This will be - // used by the resolve_initial_references (). - - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBInitRef")))) - { - const ACE_TCHAR *pos = ACE_OS::strchr (current_arg, '='); - if (pos == 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("Invalid ORBInitRef argument '%s'") - ACE_TEXT ("format is ObjectID=IOR\n"), - current_arg)); - ACE_THROW_RETURN (CORBA::INTERNAL ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - ACE_CString object_id (ACE_TEXT_ALWAYS_CHAR(current_arg), - pos - current_arg); - ACE_CString IOR (ACE_TEXT_ALWAYS_CHAR(pos + 1)); - if (this->init_ref_map_.bind (object_id, IOR) != 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("Cannot store ORBInitRef ") - ACE_TEXT ("argument '%s'\n"), - current_arg)); - ACE_THROW_RETURN (CORBA::INTERNAL ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBDefaultInitRef")))) - { - // Set the list of prefixes from -ORBDefaultInitRef. - this->orb_params ()->default_init_ref (ACE_TEXT_ALWAYS_CHAR(current_arg)); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBStdProfileComponents")))) - { - std_profile_components = - ACE_OS::atoi (current_arg); - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBResources")))) - { - ACE_DEBUG ((LM_WARNING, - ACE_TEXT ("\"-ORBResources\" has been ") - ACE_TEXT ("deprecated.\n"))); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBLogFile")))) - { - // redirect all ACE_DEBUG and ACE_ERROR output to a file - // USAGE: -ORBLogFile <file> - // default: if <file> is present = append - // if <file> is not present = create - - const ACE_TCHAR *file_name = current_arg; - arg_shifter.consume_arg (); - - // would rather use ACE_OSTREAM_TYPE out here.. - // but need ACE_FSTREAM_TYPE to call ->open(...) - // and haven't found such a macro to rep FILE* and/or fstream* - -#if defined (ACE_LACKS_IOSTREAM_TOTALLY) - - FILE* output_stream = ACE_OS::fopen (file_name, ACE_TEXT ("a")); - - ACE_LOG_MSG->msg_ostream (output_stream, 1); - -#else /* ! ACE_LACKS_IOSTREAM_TOTALLY */ - - ofstream* output_stream = 0; - - // - // note: we are allocating dynamic memory here....but - // I assume it will persist for the life of the program - // - - ACE_NEW_THROW_EX (output_stream, - ofstream (), - CORBA::NO_MEMORY ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - ENOMEM), - CORBA::COMPLETED_NO)); - ACE_CHECK_RETURN (-1); - - output_stream->open (ACE_TEXT_ALWAYS_CHAR (file_name), ios::out | ios::app); - - if (!output_stream->bad ()) - { - ACE_LOG_MSG->msg_ostream (output_stream, 1); - } - -#endif /* ACE_LACKS_IOSTREAM_TOTALLY */ - - ACE_LOG_MSG->clr_flags (ACE_Log_Msg::STDERR | ACE_Log_Msg::LOGGER); - ACE_LOG_MSG->set_flags (ACE_Log_Msg::OSTREAM); - - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBVerboseLogging")))) - { - unsigned long verbose_logging = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - - typedef void (ACE_Log_Msg::*PTMF)(u_long); - PTMF flagop = &ACE_Log_Msg::set_flags; - u_long value; - - switch (verbose_logging) - { - case 0: - flagop = &ACE_Log_Msg::clr_flags; - value = ACE_Log_Msg::VERBOSE | ACE_Log_Msg::VERBOSE_LITE; - break; - case 1: - value = ACE_Log_Msg::VERBOSE_LITE; break; - default: - value = ACE_Log_Msg::VERBOSE; break; - } - - (ACE_LOG_MSG->*flagop)(value); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBUseIMR")))) - { - // Use IR or not. - this->use_implrepo_ = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_LIB_TEXT("-ORBIMREndpointsInIOR")))) - { - this->imr_endpoints_in_ior_ = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBid")))) - { - // The ORBid is actually set in ORB_init(), and then passed - // to the TAO_ORB_Core() constructor. However, in the case - // where the ORBid third argument to ORB_init() is not zero, - // any "-ORBid" arguments in the argv argument list are - // supposed to be ignored, according to the CORBA spec. As - // such, "-ORBid" must be removed from the argument list - // since ORB_init() must remove all "-ORB" option - // arguments. - - // We obtain a lock on the ORB table when setting the - // ORBid. For this reason we should *not* set the ORBid - // here. CORBA::ORB_init() does all of the proper locking - // and setting. - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBServerId")))) - { - // The this->server_id_ is to uniquely identify a server to - // an IMR. - // Fill in later. - this->server_id_.set(ACE_TEXT_ALWAYS_CHAR(current_arg)); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_LIB_TEXT("-ORBLingerTimeout")))) - { - linger = ACE_OS::atoi (current_arg); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBEndpoint")))) - { - // Each "endpoint" is of the form: - // - // protocol://V.v@addr1,addr2,...,addrN - // - // or: - // - // protocol://addr1,addr2,...,addrN - // - // where "V.v" is an optional protocol version for each - // addr. All endpoint strings should be of the above - // form(s). - // - // Multiple sets of endpoint may be seperated by a semi-colon `;'. - // For example: - // - // corbaloc:space:2001,1.2@odyssey:2010;uiop://foo,bar - // - // All endpoint strings should be of the above form(s). - - this->set_endpoint_helper (TAO_DEFAULT_LANE, - ACE_TEXT_ALWAYS_CHAR (current_arg) - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBListenEndpoints")))) - { - // This option is similar to the -ORBEndPoint option. May be - // ORBEndpoint option will be deprecated in future. But, for - // now, I (Priyanka) am leaving so that both options can be - // used. - - this->set_endpoint_helper (TAO_DEFAULT_LANE, - ACE_TEXT_ALWAYS_CHAR (current_arg) - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBLaneEndpoint"))) || - (current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBLaneListenEndpoints")))) - { - // This option is similar to the -ORBEndPoint option but - // specifies endpoints for each lane. - - if (arg_shifter.is_option_next ()) - return -1; - - ACE_CString lane (ACE_TEXT_ALWAYS_CHAR (current_arg)); - arg_shifter.consume_arg (); - - if(arg_shifter.is_option_next ()) - return -1; - - ACE_CString endpoints (ACE_TEXT_ALWAYS_CHAR (arg_shifter.get_current ())); - arg_shifter.consume_arg (); - - this->set_endpoint_helper (lane, - endpoints - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBNoProprietaryActivation")))) - { - // This option can be used to set to not use any proprietary - // activation framework. The only TAO proprietary activation - // framework is IMR. So, by setting this option in TAO, the - // IMR shouldnt be used .. even if the ORBUseIMR option is - // set. - // Fill in later - // @@ To do later: Priyanka. - - ACE_THROW_RETURN (CORBA::NO_IMPLEMENT (), -1); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_LIB_TEXT("-ORBUseSharedProfile")))) - { - this->orb_params ()->shared_profile - (ACE_OS::atoi (current_arg)); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBSingleReadOptimization")))) - { - this->orb_params ()->single_read_optimization - (ACE_OS::atoi (current_arg)); - - arg_shifter.consume_arg (); - } - else if ((current_arg = arg_shifter.get_the_parameter - (ACE_TEXT("-ORBDisableRTCollocation")))) - { - const ACE_TCHAR *popt = current_arg; - if (ACE_OS::strcasecmp (popt, ACE_TEXT("NO")) == 0) - { - this->orb_params ()->disable_rt_collocation_resolver (false); - } - else if (ACE_OS::strcasecmp (popt, ACE_TEXT("YES")) == 0) - { - this->orb_params ()->disable_rt_collocation_resolver (true); - } - else - { - // Should we print an error mesg?? Probably we - // should. We will look into this after 1.4 and make all - // the options consistent. - } - - arg_shifter.consume_arg (); - } - //////////////////////////////////////////////////////////////// - // catch any unknown -ORB args // - //////////////////////////////////////////////////////////////// - else if (arg_shifter.cur_arg_strncasecmp (ACE_TEXT("-ORB")) != -1) - { - if (TAO_debug_level > 0) - { - current_arg = arg_shifter.get_current (); - ACE_DEBUG ((LM_ERROR, - ACE_TEXT ("ERROR: Unknown \"-ORB\" option ") - ACE_TEXT ("<%s>.\n"), - ((current_arg == 0) ? ACE_TEXT("<NULL>") : current_arg))); - } - - ACE_THROW_RETURN (CORBA::BAD_PARAM ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - EINVAL), - CORBA::COMPLETED_NO), - -1); - } - - //////////////////////////////////////////////////////////////// - // ok, we can't interpret this argument, move to next argument// - //////////////////////////////////////////////////////////////// - else - // Any arguments that don't match are ignored so that the - // caller can still use them. - arg_shifter.ignore_arg (); - } - - const char *env_endpoint = - ACE_OS::getenv ("TAO_ORBENDPOINT"); - - if (env_endpoint != 0) - { - int result = - this->orb_params ()->add_endpoints (TAO_DEFAULT_LANE, - env_endpoint); - - if (result != 0) - { - if (TAO_debug_level > 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("ERROR: Environment variable TAO_ORBENDPOINT set to invalid value ") - ACE_TEXT ("<%s>.\n"), - env_endpoint)); - } - - ACE_THROW_RETURN (CORBA::BAD_PARAM ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - EINVAL), - CORBA::COMPLETED_NO), - -1); - } - } - -#if defined (SIGPIPE) && !defined (ACE_LACKS_UNIX_SIGNALS) - // There's really no way to deal with this in a portable manner, so - // we just have to suck it up and get preprocessor conditional and - // ugly. - // - // Impractical to have each call to the ORB protect against the - // implementation artifact of potential writes to dead connections, - // as it'd be way expensive. Do it here; who cares about SIGPIPE in - // these kinds of applications, anyway? - (void) ACE_OS::signal (SIGPIPE, (ACE_SignalHandler) SIG_IGN); -#endif /* SIGPIPE */ - - // Calling the open method here so that the svc.conf file is - // opened and TAO_default_resource_factory::init () is called by the - // time this method is called. - this->parser_registry_.open (this); - - // Initialize the pointers to resources in the ORB Core instance, - // e.g., reactor, connector, etc. Must do this after we open - // services because we'll load the factory from there. - TAO_Resource_Factory *trf = this->resource_factory (); - - if (trf == 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) %p\n"), - ACE_TEXT ("ORB Core unable to find a ") - ACE_TEXT ("Resource Factory instance"))); - ACE_THROW_RETURN (CORBA::INTERNAL ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - // @@Phil: Could we add a -ORB option to prevent creation of codeset - // manager. This adds to our runtime footprint. It would be awesome - // if we can do away with this if the user doesnt want to. Does that - // sound reasonable? Please let me know if this is not possible. - - this->codeset_manager_ = trf->get_codeset_manager(); - if (this->codeset_manager_ == 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) %p\n"), - ACE_TEXT ("ORB Core unable to initialize codeset_manager"))); - ACE_THROW_RETURN (CORBA::INITIALIZE ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - // @@ ???? - // Make sure the reactor is initialized... - ACE_Reactor *reactor = this->reactor (); - if (reactor == 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) %p\n"), - ACE_TEXT ("ORB Core unable to initialize reactor"))); - ACE_THROW_RETURN (CORBA::INITIALIZE ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - TAO_Server_Strategy_Factory *ssf = this->server_factory (); - - if (ssf == 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) %p\n"), - ACE_TEXT ("ORB Core unable to find a ") - ACE_TEXT ("Server Strategy Factory instance"))); - ACE_THROW_RETURN (CORBA::INTERNAL ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - } - - ssf->open (this); - - // Open the ObjectKey_Table - (void) this->object_key_table_.init (this); - - // Obtain the timeout value for the thread-per-connection model - this->thread_per_connection_use_timeout_ = - ssf->thread_per_connection_timeout (this->thread_per_connection_timeout_); - - if (thread_per_connection_use_timeout_ == -1) - { - if (ACE_OS::strcasecmp (TAO_DEFAULT_THREAD_PER_CONNECTION_TIMEOUT, - "INFINITE") == 0) - { - this->thread_per_connection_use_timeout_ = 0; - } - else - { - this->thread_per_connection_use_timeout_ = 1; - int milliseconds = - ACE_OS::atoi (TAO_DEFAULT_THREAD_PER_CONNECTION_TIMEOUT); - // Use a temporary to obtain automatic normalization. - this->thread_per_connection_timeout_ = - ACE_Time_Value (0, 1000 * milliseconds); - } - } - if (this->thread_per_connection_use_timeout_ == 0) - { - // Do not wait for the server threads because they may block - // forever. - this->tm_.wait_on_exit (0); - } - - // Initialize the "ORB" pseudo-object now. - this->orb_ = CORBA::ORB::_tao_make_ORB (this); - - // This should probably move into the ORB Core someday rather then - // being done at this level. - this->orb_->_use_omg_ior_format (use_ior); - - // Set all kinds of orb parameters whose setting needed to be - // deferred until after the service config entries had been - // determined. - - this->orb_params ()->service_port (NAMESERVICE, ns_port); - - if (ns_port != 0) - { - char ns_port_char[256]; - - ACE_OS::itoa (ns_port, - ns_port_char, - 10); - - CORBA::String_var ns_port_ptr = - CORBA::string_alloc (static_cast<CORBA::ULong> ( - ACE_OS::strlen ((const char *) ns_port_char))); - - ns_port_ptr = (const char *) ns_port_char; - - const char prefix[] = "mcast://:"; - - CORBA::String_var def_init_ref = - CORBA::string_alloc (sizeof (prefix) + - static_cast<CORBA::ULong> ( - ACE_OS::strlen (ns_port_ptr.in ())) + - 2); - - ACE_OS::strcpy (def_init_ref.inout (), prefix); - ACE_OS::strcat (def_init_ref.inout (), ns_port_ptr.in ()); - ACE_OS::strcat (def_init_ref.inout (), "::"); - - this->orb_params ()->default_init_ref (def_init_ref.in ()); - } - - this->orb_params ()->service_port (TRADINGSERVICE, ts_port); - this->orb_params ()->service_port (IMPLREPOSERVICE, ir_port); - - this->orb_params ()->use_dotted_decimal_addresses (dotted_decimal_addresses); - this->orb_params ()->linger (linger); - this->orb_params ()->nodelay (nodelay); - if (rcv_sock_size >= 0) - this->orb_params ()->sock_rcvbuf_size (rcv_sock_size); - if (snd_sock_size >= 0) - this->orb_params ()->sock_sndbuf_size (snd_sock_size); - if (cdr_tradeoff >= 0) - this->orb_params ()->cdr_memcpy_tradeoff (cdr_tradeoff); - - this->orb_params ()->std_profile_components (std_profile_components); - - // Set up the pluggable protocol infrastructure. First get a - // pointer to the protocol factories set, then obtain pointers to - // all factories loaded by the service configurator. - // Load all protocol factories! - if (trf->init_protocol_factories () == -1) - ACE_THROW_RETURN (CORBA::INITIALIZE ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - - // init the ORB core's pointer - this->protocol_factories_ = trf->get_protocol_factories (); - - // Initialize the flushing strategy - this->flushing_strategy_ = trf->create_flushing_strategy (); - - // Look in the service repository for an instance of the Protocol Hooks. - this->protocols_hooks_ = - ACE_Dynamic_Service<TAO_Protocols_Hooks>::instance - (TAO_ORB_Core_Static_Resources::instance ()->protocols_hooks_name_.c_str()); - - // Must have valid protocol hooks. - if (this->protocols_hooks_ == 0) - ACE_THROW_RETURN (CORBA::INITIALIZE ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - 0), - CORBA::COMPLETED_NO), - -1); - - // Initialize the protocols hooks instance. - this->protocols_hooks_->init_hooks (this - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - - // Look for BiDirectional library here. If the user has svc.conf - // file, load the library at this point. - int ret = this->bidirectional_giop_init (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (-1); - - if (ret == -1) - return -1; - - // As a last step perform initializations of the service callbacks - this->services_callbacks_init (); - - // The ORB has been initialized, meaning that the ORB is no longer - // in the shutdown state. - this->has_shutdown_ = 0; - - return 0; -} - - -int -TAO_ORB_Core::fini (void) -{ - ACE_TRY_NEW_ENV - { - // Shutdown the ORB and block until the shutdown is complete. - this->shutdown (1 - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - ACE_CString message = - "Exception caught in trying to shutdown "; - message += this->orbid_; - message += "\n"; - - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, - message.c_str ()); - } - ACE_ENDTRY; - - // Wait for any server threads, ignoring any failures. - (void) this->thr_mgr ()->wait (); - - CORBA::release (this->implrepo_service_); - - CORBA::release (this->typecode_factory_); - - CORBA::release (this->codec_factory_); - - CORBA::release (this->dynany_factory_); - - CORBA::release (this->ior_manip_factory_); - - CORBA::release (this->ior_table_); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("Destroying ORB <%s>\n"), - ACE_TEXT_CHAR_TO_TCHAR (this->orbid_))); - } - - // Finalize lane resources. - // - // @@ Do not call this->thread_lane_resources_manager().finalize(). - // this->thread_lane_manager_resources() can seg fault if the - // factory method it invokes returns a zero pointer, which can - // easily occur if the ORB is partially initialized due to a Service - // Configurator initialization failure. Instead check if the - // cached pointer is non-zero and then finalize. - // - // @todo Fix potential seg fault in - // TAO_ORB_Core::thread_lane_resources_manager(). - if (this->thread_lane_resources_manager_ != 0) - this->thread_lane_resources_manager_->finalize (); - - (void) TAO::ORB::close_services (); - - // Destroy the object_key table - this->object_key_table_.destroy (); - - delete this; - - return 0; -} - -void -TAO_ORB_Core::set_thread_lane_resources_manager_factory (const char *thread_lane_resources_manager_factory_name) -{ - TAO_ORB_Core_Static_Resources::instance ()->thread_lane_resources_manager_factory_name_ = - thread_lane_resources_manager_factory_name; -} - -void -TAO_ORB_Core::set_collocation_resolver (const char *collocation_resolver_name) -{ - TAO_ORB_Core_Static_Resources::instance ()->collocation_resolver_name_ = - collocation_resolver_name; -} - -void -TAO_ORB_Core::set_stub_factory (const char *stub_factory_name) -{ - TAO_ORB_Core_Static_Resources::instance ()->stub_factory_name_ = - stub_factory_name; -} - -void -TAO_ORB_Core::set_resource_factory (const char *resource_factory_name) -{ - TAO_ORB_Core_Static_Resources::instance ()->resource_factory_name_ = - resource_factory_name; -} - -void -TAO_ORB_Core::set_gui_resource_factory (TAO::GUIResource_Factory *gui_resource_factory) -{ - if (TAO_TSS_RESOURCES::instance ()->gui_resource_factory_ != 0) - { - - ACE_DEBUG ((LM_WARNING, - "TAO (%P|%t) - Deleting old gui_resource_factory.\n")); - delete TAO_TSS_RESOURCES::instance ()->gui_resource_factory_; - } - - TAO_TSS_RESOURCES::instance ()->gui_resource_factory_ = gui_resource_factory; -} - -void -TAO_ORB_Core::dynamic_adapter_name (const char *name) -{ - TAO_ORB_Core_Static_Resources::instance ()->dynamic_adapter_name_ = name; -} - -const char * -TAO_ORB_Core::dynamic_adapter_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->dynamic_adapter_name_.c_str(); -} - -void -TAO_ORB_Core::ifr_client_adapter_name (const char *name) -{ - TAO_ORB_Core_Static_Resources::instance ()->ifr_client_adapter_name_ = name; -} - -const char * -TAO_ORB_Core::ifr_client_adapter_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->ifr_client_adapter_name_.c_str(); -} - -void -TAO_ORB_Core::typecodefactory_adapter_name (const char *name) -{ - TAO_ORB_Core_Static_Resources::instance ()->typecodefactory_adapter_name_ = name; -} - -const char * -TAO_ORB_Core::typecodefactory_adapter_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->typecodefactory_adapter_name_.c_str(); -} - -void -TAO_ORB_Core::iorinterceptor_adapter_factory_name (const char *name) -{ - TAO_ORB_Core_Static_Resources::instance ()->iorinterceptor_adapter_factory_name_ = name; -} - -const char * -TAO_ORB_Core::iorinterceptor_adapter_factory_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->iorinterceptor_adapter_factory_name_.c_str(); -} - -void -TAO_ORB_Core::valuetype_adapter_name (const char *name) -{ - TAO_ORB_Core_Static_Resources::instance ()->valuetype_adapter_name_ = name; -} - -const char * -TAO_ORB_Core::valuetype_adapter_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->valuetype_adapter_name_.c_str(); -} - -TAO_Resource_Factory * -TAO_ORB_Core::resource_factory (void) -{ - // Check if there is a cached reference. - if (this->resource_factory_ != 0) - { - return this->resource_factory_; - } - - // Look in the service repository for an instance. - this->resource_factory_ = - ACE_Dynamic_Service<TAO_Resource_Factory>::instance - (TAO_ORB_Core_Static_Resources::instance ()->resource_factory_name_.c_str()); - - return this->resource_factory_; -} - -TAO::GUIResource_Factory * -TAO_ORB_Core::gui_resource_factory (void) -{ - return TAO_TSS_RESOURCES::instance ()->gui_resource_factory_; -} - - -TAO_Thread_Lane_Resources_Manager & -TAO_ORB_Core::thread_lane_resources_manager (void) -{ - // Check if there is a cached reference. - if (this->thread_lane_resources_manager_ != 0) - return *this->thread_lane_resources_manager_; - - // If not, lookup the corresponding factory and ask it to make one. - TAO_Thread_Lane_Resources_Manager_Factory *factory = - ACE_Dynamic_Service<TAO_Thread_Lane_Resources_Manager_Factory>::instance - (TAO_ORB_Core_Static_Resources::instance ()->thread_lane_resources_manager_factory_name_.c_str()); - - this->thread_lane_resources_manager_ = - factory->create_thread_lane_resources_manager (*this); - - return *this->thread_lane_resources_manager_; -} - -TAO_Collocation_Resolver & -TAO_ORB_Core::collocation_resolver (void) -{ - // Check if there is a cached reference. - if (this->collocation_resolver_ != 0) - return *this->collocation_resolver_; - - // If not, lookup it up. - this->collocation_resolver_ = - ACE_Dynamic_Service<TAO_Collocation_Resolver>::instance - (TAO_ORB_Core_Static_Resources::instance ()->collocation_resolver_name_.c_str()); - - return *this->collocation_resolver_; -} - -TAO::PolicyFactory_Registry_Adapter * -TAO_ORB_Core::policy_factory_registry_i (void) -{ - - TAO_PolicyFactory_Registry_Factory *loader = - ACE_Dynamic_Service<TAO_PolicyFactory_Registry_Factory>::instance ( - "PolicyFactory_Loader"); - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("TAO_PolicyFactory_Registry_Factory", - "TAO_PI", - "_make_PolicyFactory_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_PolicyFactory_Registry_Factory>::instance ( - "PolicyFactory_Loader"); - } - - if (loader != 0) - { - this->policy_factory_registry_ = - loader->create (); - } - - return this->policy_factory_registry_; -} - -TAO::ORBInitializer_Registry_Adapter * -TAO_ORB_Core::orbinitializer_registry_i (void) -{ - // If not, lookup it up. - this->orbinitializer_registry_ = - ACE_Dynamic_Service<TAO::ORBInitializer_Registry_Adapter>::instance - ("ORBInitializer_Registry"); - -#if !defined (TAO_AS_STATIC_LIBS) - // In case we build shared, try to load the PI Client library, in a - // static build we just can't do this, so don't try it, lower layers - // output an error then. - if (orbinitializer_registry_ == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("ORBInitializer_Registry", - "TAO_PI", - "_make_ORBInitializer_Registry", - "")); - orbinitializer_registry_ = - ACE_Dynamic_Service<TAO::ORBInitializer_Registry_Adapter>::instance - ("ORBInitializer_Registry"); - } -#endif /* !TAO_AS_STATIC_LIBS */ - - return this->orbinitializer_registry_; -} - -TAO_Stub_Factory * -TAO_ORB_Core::stub_factory (void) -{ - // Check if there is a cached reference. - if (this->stub_factory_ != 0) - return this->stub_factory_; - - // If not, look in the service repository for an instance. - this->stub_factory_ = - ACE_Dynamic_Service<TAO_Stub_Factory>::instance - (TAO_ORB_Core_Static_Resources::instance ()->stub_factory_name_.c_str()); - - return this->stub_factory_; -} - -void -TAO_ORB_Core::set_poa_factory (const char *poa_factory_name, - const char *poa_factory_directive) -{ - TAO_ORB_Core_Static_Resources::instance ()->poa_factory_name_ = - poa_factory_name; - TAO_ORB_Core_Static_Resources::instance ()->poa_factory_directive_ = - poa_factory_directive; -} - -const ACE_CString & -TAO_ORB_Core::poa_factory_name (void) -{ - return TAO_ORB_Core_Static_Resources::instance ()->poa_factory_name_; -} - -void -TAO_ORB_Core::set_endpoint_selector_factory (const char *endpoint_selector_factory_name) -{ - TAO_ORB_Core_Static_Resources::instance ()->endpoint_selector_factory_name_ = - endpoint_selector_factory_name; -} - -TAO_Endpoint_Selector_Factory * -TAO_ORB_Core::endpoint_selector_factory (void) -{ - // Check if there is a cached reference. - if (this->endpoint_selector_factory_ != 0) - return this->endpoint_selector_factory_; - - // If not, look in the service repository for an instance. - this->endpoint_selector_factory_ = - ACE_Dynamic_Service<TAO_Endpoint_Selector_Factory>::instance - (TAO_ORB_Core_Static_Resources::instance ()->endpoint_selector_factory_name_.c_str()); - - return this->endpoint_selector_factory_; -} - -void -TAO_ORB_Core::set_protocols_hooks (const char *protocols_hooks_name) -{ - // Is synchronization necessary? - TAO_ORB_Core_Static_Resources::instance ()->protocols_hooks_name_ = - protocols_hooks_name; -} - -TAO_Protocols_Hooks * -TAO_ORB_Core::get_protocols_hooks (void) -{ - return this->protocols_hooks_; -} - -int -TAO_ORB_Core::bidirectional_giop_init (ACE_ENV_SINGLE_ARG_DECL) -{ - if (this->bidir_adapter_ == 0) - { - this->bidir_adapter_ = - ACE_Dynamic_Service<TAO_BiDir_Adapter>::instance ("BiDirGIOP_Loader"); - } - - if (this->bidir_adapter_) - return this->bidir_adapter_->activate (this->orb_, - 0, - 0 - ACE_ENV_ARG_PARAMETER); - else - return 0; -} - -void -TAO_ORB_Core::services_callbacks_init (void) -{ - // We (should) know what are the services that would need - // callbacks. So, what we do is go through the Service Configurator - // list for looking at the services that we want to load. - this->ft_service_.init (this); - - // @@ Other service callbacks can be added here -} - -TAO::Invocation_Status -TAO_ORB_Core::service_raise_comm_failure ( - IOP::ServiceContextList &clist, - TAO_Profile *profile - ACE_ENV_ARG_DECL) -{ - if (this->ft_service_.service_callback ()) - { - return this->ft_service_.service_callback ()-> - raise_comm_failure (clist, - profile - ACE_ENV_ARG_PARAMETER); - } - - ACE_THROW_RETURN (CORBA::COMM_FAILURE ( - CORBA::SystemException::_tao_minor_code ( - TAO_INVOCATION_RECV_REQUEST_MINOR_CODE, - errno), - CORBA::COMPLETED_MAYBE), - TAO::TAO_INVOKE_SYSTEM_EXCEPTION); -} - - -TAO::Invocation_Status -TAO_ORB_Core::service_raise_transient_failure ( - IOP::ServiceContextList &clist, - TAO_Profile *profile - ACE_ENV_ARG_DECL) -{ - if (this->ft_service_.service_callback ()) - { - return - this->ft_service_.service_callback ()->raise_transient_failure (clist, - profile - ACE_ENV_ARG_PARAMETER); - } - - return TAO::TAO_INVOKE_FAILURE; -} - -void -TAO_ORB_Core::service_context_list ( - TAO_Stub *stub, - TAO_Service_Context &service_context, - CORBA::Boolean restart - ACE_ENV_ARG_DECL) -{ - // @NOTE: Can use Interceptors instead.. - this->protocols_hooks_->rt_service_context (stub, - service_context, - restart - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; -} - -TAO_Client_Strategy_Factory * -TAO_ORB_Core::client_factory (void) -{ - if (this->client_factory_ == 0) - { - // Look in the service repository for an instance. - this->client_factory_ = - ACE_Dynamic_Service<TAO_Client_Strategy_Factory>::instance ("Client_Strategy_Factory"); - } - - return this->client_factory_; -} - -TAO_Server_Strategy_Factory * -TAO_ORB_Core::server_factory (void) -{ - if (this->server_factory_ == 0) - { - // Look in the service repository for an instance. - this->server_factory_ = - ACE_Dynamic_Service<TAO_Server_Strategy_Factory>::instance ("Server_Strategy_Factory"); - } - - return this->server_factory_; -} - -CORBA::Object_ptr -TAO_ORB_Core::root_poa (ACE_ENV_SINGLE_ARG_DECL) -{ - // DCL .. - if (CORBA::is_nil (this->root_poa_.in ())) - { - TAO_ORB_Core_Static_Resources* static_resources = - TAO_ORB_Core_Static_Resources::instance (); - - TAO_Adapter_Factory *factory = - ACE_Dynamic_Service<TAO_Adapter_Factory>::instance ( - static_resources->poa_factory_name_.c_str()); - - if (factory == 0) - { - ACE_Service_Config::process_directive ( - ACE_TEXT_CHAR_TO_TCHAR ( - static_resources->poa_factory_directive_.c_str())); - factory = - ACE_Dynamic_Service<TAO_Adapter_Factory>::instance ( - static_resources->poa_factory_name_.c_str()); - } - - if (factory == 0) - { - return CORBA::Object::_nil (); - } - - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - monitor, - this->open_lock_, - 0); - - if (CORBA::is_nil (this->root_poa_.in ())) - { - // @@ Not exception safe - TAO_Adapter *poa_adapter = - factory->create (this); - - poa_adapter->open (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Object::_nil ()); - - // @@ Not exception safe - this->root_poa_ = - poa_adapter->root (); - - this->adapter_registry_.insert (poa_adapter - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Object::_nil ()); - } - } - - return CORBA::Object::_duplicate (this->root_poa_.in ()); -} - -TAO_Adapter * -TAO_ORB_Core::poa_adapter (void) -{ - if (this->poa_adapter_ == 0) - { - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, 0); - if (this->poa_adapter_ == 0) - { - this->poa_adapter_ = - this->adapter_registry_.find_adapter ("RootPOA"); - } - } - return this->poa_adapter_; -} - -TAO_Stub * -TAO_ORB_Core::create_stub (const char *repository_id, - const TAO_MProfile &profiles - ACE_ENV_ARG_DECL) -{ - TAO_Stub *retval = - this->stub_factory ()->create_stub (repository_id, - profiles, - this - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN(0); - return retval; -} - -void -TAO_ORB_Core::request_dispatcher (TAO_Request_Dispatcher *request_dispatcher) -{ - // Assume ownership of the request dispatcher. - TAO_Request_Dispatcher *tmp = this->request_dispatcher_; - this->request_dispatcher_ = request_dispatcher; - delete tmp; -} - -TAO_Stub * -TAO_ORB_Core::create_stub_object (TAO_MProfile &mprofile, - const char *type_id, - CORBA::PolicyList *policy_list - ACE_ENV_ARG_DECL) -{ - // Add the Polices contained in "policy_list" to each profile so - // that those policies will be exposed to the client in the IOR. In - // particular each CORBA::Policy has to be converted in to - // Messaging::PolicyValue, and then all the Messaging::PolicyValue - // should be embedded inside a Messaging::PolicyValueSeq which - // became in turns the "body" of the IOP::TaggedComponent. This - // conversion is a responsability of the CORBA::Profile class. (See - // orbos\98-05-05.pdf Section 5.4) - if (policy_list->length () != 0) - { - TAO_Profile * profile; - - const CORBA::ULong count = mprofile.profile_count (); - for (CORBA::ULong i = 0; i < count; ++i) - { - // Get the ith profile - profile = mprofile.get_profile (i); - profile->policies (policy_list ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - } - } - - /// Initialize a TAO_Stub object with the mprofile thats passed. - TAO_Stub *stub = - this->create_stub (type_id, mprofile ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (stub); - - stub->base_profiles ().policy_list (policy_list); - - return stub; -} - -void -TAO_ORB_Core::load_policy_validators (TAO_Policy_Validator &validator - ACE_ENV_ARG_DECL) -{ - // Call the BiDir library if it has been loaded - if (this->bidir_adapter_) - this->bidir_adapter_->load_policy_validators (validator ACE_ENV_ARG_PARAMETER); -} - -CORBA::Object_ptr -TAO_ORB_Core::create_object (TAO_Stub *stub) -{ - // @@ What about forwarding. With this approach we are never forwarded - // when we use collocation! - const TAO_MProfile &mprofile = stub->base_profiles (); - - // @@ We should thow CORBA::NO_MEMORY in platforms with exceptions, - // but we are stuck in platforms without exceptions! - CORBA::Object_ptr x; - { - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - guard, - this->lock_, - CORBA::Object::_nil ()); - - TAO::ORB_Table * const table = TAO::ORB_Table::instance (); - const TAO::ORB_Table::Iterator end = table->end (); - for (TAO::ORB_Table::Iterator i = table->begin (); i != end; ++i) - { - TAO_ORB_Core *other_core = (*i).int_id_; - - if (this->is_collocation_enabled (other_core, - mprofile)) - { - TAO_Adapter_Registry *ar = - other_core->adapter_registry (); - - return ar->create_collocated_object (stub, - mprofile); - } - } - } - - // The constructor sets the proxy broker as the - // Remote one. - ACE_NEW_RETURN (x, - CORBA::Object (stub, 0), - 0); - return x; -} - -CORBA::Long -TAO_ORB_Core::initialize_object (TAO_Stub *stub, - CORBA::Object_ptr obj) -{ - // @@ What about forwarding. With this approach we are never forwarded - // when we use collocation! - const TAO_MProfile &mprofile = - stub->base_profiles (); - { - // @@ Ossama: maybe we need another lock for the table, to - // reduce contention on the Static_Object_Lock below, if so - // then we need to use that lock in the ORB_init() function. - ACE_MT (ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - guard, - this->lock_, - 0)); - - TAO::ORB_Table * const table = TAO::ORB_Table::instance (); - TAO::ORB_Table::Iterator const end = table->end (); - for (TAO::ORB_Table::Iterator i = table->begin (); i != end; ++i) - { - TAO_ORB_Core * const other_core = (*i).int_id_; - - if (this->is_collocation_enabled (other_core, - mprofile)) - { - TAO_Adapter_Registry * const ar = - other_core->adapter_registry (); - - return ar->initialize_collocated_object (stub, - obj); - } - } - } - - return 0; -} - -CORBA::Boolean -TAO_ORB_Core::is_collocation_enabled (TAO_ORB_Core *orb_core, - const TAO_MProfile &mp) -{ - if (!orb_core->optimize_collocation_objects ()) - return 0; - - if (!orb_core->use_global_collocation () && orb_core != this) - return 0; - - if (!orb_core->is_collocated (mp)) - return 0; - - return 1; -} - -int -TAO_ORB_Core::is_collocated (const TAO_MProfile& mprofile) -{ - // @@ Lots of issues arise when dealing with collocation. What about - // forwarding or what if this is a multi-profile IOR where the order is - // significant and only one of the profiles is collocated. For example - // when using a multiple servers for fault tolerance. For now, we just - // look through all profiles and if any are colocated then we assume - // the object is collocated. - // @@ Note, if collocated we can not be forwarded! - // Also, acceptor_registry_->is_collocated (...) will check the - // address (ORB Host) but not the object_key. This should be checked - // also. - - return this->thread_lane_resources_manager ().is_collocated (mprofile); -} - -// **************************************************************** - -TAO_Leader_Follower & -TAO_ORB_Core::leader_follower (void) -{ - return this->lane_resources ().leader_follower (); -} - -TAO_LF_Strategy & -TAO_ORB_Core::lf_strategy (void) -{ - return this->thread_lane_resources_manager ().lf_strategy (); -} - -int -TAO_ORB_Core::run (ACE_Time_Value *tv, - int perform_work - ACE_ENV_ARG_DECL_NOT_USED) -{ - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - ORB_Core::run, ") - ACE_TEXT ("start [%s]\n"), - perform_work?ACE_TEXT("perform_work"):ACE_TEXT("run"))); - } - - // Fetch the Reactor - ACE_Reactor *r = this->reactor (); - - int result = 1; - // 1 to detect that nothing went wrong - - // Loop handling client requests until the ORB is shutdown. - - // We could use the leader-follower lock to check for the state - // if this variable or use the lock <create_event_loop_lock> in - // the server strategy factory. - // We don't need to do this because we use the Reactor - // mechanisms to shutdown in a thread-safe way. - - while (this->has_shutdown () == 0) - { - // Every time we perform an interation we have to become the - // leader again, because it is possible that a client has - // acquired the leader role... - TAO_Leader_Follower &leader_follower = - this->leader_follower (); - - TAO_LF_Strategy &lf_strategy = - this->lf_strategy (); - - TAO_LF_Event_Loop_Thread_Helper helper (leader_follower, - lf_strategy, - tv); - result = helper.event_loop_return (); - if (result != 0) - { - if (errno == ETIME) - return 0; - else - return result; - } - - // Set the owning thread of the Reactor to the one which we're - // currently in. This is necessary b/c it's possible that the - // application is calling us from a thread other than that in which - // the Reactor's CTOR (which sets the owner) was called. - // - // We need to do this on every iteration because the reactor may be - // acquired by one of the client threads in the LF waiting - // strategy - r->owner (ACE_Thread::self ()); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - ORB_Core::run, ") - ACE_TEXT ( "calling handle_events()\n"))); - } - - result = r->handle_events (tv); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - ORB_Core::run, ") - ACE_TEXT ("handle_events() returns %d\n"), - result)); - } - - if (result == -1) - { - // An error, terminate the loop - break; - } - if (result == 0 - && tv != 0 - && *tv == ACE_Time_Value::zero) - { - // A timeout, terminate the loop... - break; - } - if (perform_work) - { - // This is running on behalf of a perform_work() call, - // The loop should run only once. - break; - } - // Otherwise just continue.. - } - - if (this->has_shutdown () == 1 && - this->server_factory_->activate_server_connections ()) - this->tm_.wait (); - - if (TAO_debug_level > 2) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - ORB_Core::run, ") - ACE_TEXT ("ends with result = %d\n"), - result)); - } - - return result; -} - - -void -TAO_ORB_Core::shutdown (CORBA::Boolean wait_for_completion - ACE_ENV_ARG_DECL) - ACE_THROW_SPEC (()) -{ - ACE_TRY - { - { - ACE_GUARD (TAO_SYNCH_MUTEX, monitor, this->lock_); - - if (this->has_shutdown () != 0) - return; - - // Check if we are on the right state, i.e. do not accept - // shutdowns with the 'wait_for_completion' flag set in the middle - // of an upcall (because those deadlock). - this->adapter_registry_.check_close (wait_for_completion - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - // Set the 'has_shutdown' flag, so any further attempt to shutdown - // becomes a noop. - this->has_shutdown_ = 1; - - // need to release the mutex, because some of the shutdown - // operations invoke application code, that could (and in practice - // does!) callback into ORB Core code. - } - - this->adapter_registry_.close (wait_for_completion - ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - // Shutdown reactor. - this->thread_lane_resources_manager ().shutdown_reactor (); - - // Cleanup transports that use the RW strategies - this->thread_lane_resources_manager ().cleanup_rw_transports (); - - // Grab the thread manager - ACE_Thread_Manager *tm = this->thr_mgr (); - - // Try to cancel all the threads in the ORB. - tm->cancel_all (); - - // If <wait_for_completion> is set, wait for all threads to exit. - if (wait_for_completion != 0) - tm->wait (); - - // Explicitly destroy the object reference table since it - // contains references to objects, which themselves may contain - // reference to this ORB. - this->object_ref_table_.destroy (); - -#if (TAO_HAS_INTERCEPTORS == 1) - CORBA::release (this->pi_current_); - this->pi_current_ = 0; // For the sake of consistency. -#endif /* TAO_HAS_INTERCEPTORS == 1 */ - } - ACE_CATCHALL - { - // Do not allow exceptions to escape.. So catch all the - // exceptions. - // @@ Not sure what to print here for the users.. - - } - ACE_ENDTRY; - - return; -} - -void -TAO_ORB_Core::destroy (ACE_ENV_SINGLE_ARG_DECL) -{ - // - // All destroy() should do is (a) call shutdown() and (b) unbind() - // from the ORB table. Nothing else should really be added to this - // method. Everything else should go to the shutdown() method. - // Remember when the ORB Core is finally removed from the ORB table, - // the reference count goes to zero and fini() is called. fini() - // calls shutdown() and does not call destroy() since destroy() will - // try to unbind from the ORB table again. Additional code should - // not be added to destroy() since there is no guarantee that - // orb->destroy() will ever be called by the user. Since TAO - // guarantees that shutdown() will be called, all cleanup code - // should go there. - // - - // Shutdown the ORB and block until the shutdown is complete. - this->shutdown (1 - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - // Invoke Interceptor::destroy() on all registered interceptors. - this->destroy_interceptors (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - // Now remove it from the ORB table so that it's ORBid may be - // reused. - TAO::ORB_Table::instance ()->unbind (this->orbid_); -} - -void -TAO_ORB_Core::check_shutdown (ACE_ENV_SINGLE_ARG_DECL) -{ - if (this->has_shutdown ()) - { - // As defined by the CORBA 2.3 specification, throw a - // CORBA::BAD_INV_ORDER exception with minor code 4 if the ORB - // has shutdown by the time an ORB function is called. - - ACE_THROW (CORBA::BAD_INV_ORDER (CORBA::OMGVMCID | 4, - CORBA::COMPLETED_NO)); - } -} - -void -TAO_ORB_Core::destroy_interceptors (ACE_ENV_SINGLE_ARG_DECL) - ACE_THROW_SPEC (()) -{ - - ACE_TRY - { -#if TAO_HAS_INTERCEPTORS == 1 - size_t len = 0; // The length of the interceptor array. - size_t ilen = 0; // The incremental length of the interceptor array. - - TAO::ClientRequestInterceptor_List::TYPE &client_interceptors = - this->client_request_interceptors_.interceptors (); - - len = client_interceptors.size (); - ilen = len; - - for (size_t i = 0; i < len; ++i) - { - // Destroy the interceptors in reverse order in case the array - // list is only partially destroyed and another invocation - // occurs afterwards. - --ilen; - - client_interceptors[ilen]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - - // Since Interceptor::destroy() can throw an exception, decrease - // the size of the interceptor array incrementally since some - // interceptors may not have been destroyed yet. Note that this - // size reduction is fast since no memory is actually - // deallocated. - client_interceptors.size (ilen); - } - - TAO::ServerRequestInterceptor_List::TYPE &server_interceptors = - this->server_request_interceptors_.interceptors (); - - len = server_interceptors.size (); - ilen = len; - - for (size_t j = 0; j < len; ++j) - { - // Destroy the interceptors in reverse order in case the array - // list is only partially destroyed and another invocation - // occurs afterwards. - --ilen; - - server_interceptors[ilen]->destroy (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - - // Since Interceptor::destroy() can throw an exception, decrease - // the size of the interceptor array incrementally since some - // interceptors may not have been destroyed yet. Note that this - // size reduction is fast since no memory is actually - // deallocated. - server_interceptors.size (ilen); - } - -#endif /* TAO_HAS_INTERCEPTORS == 1 */ - - if (this->ior_interceptor_adapter_ != 0) - { - this->ior_interceptor_adapter_->destroy_interceptors ( - ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - - this->ior_interceptor_adapter_ = 0; - } - - } - ACE_CATCHALL - { - // .. catch all the exceptions.. - if (TAO_debug_level > 3) - { - ACE_DEBUG ((LM_DEBUG, - ACE_TEXT ("TAO (%P|%t) - Exception in TAO_ORB_Core") - ACE_TEXT ("::destroy_interceptors () \n"))); - } - } - ACE_ENDTRY; - - return; -} - -TAO_Thread_Lane_Resources & -TAO_ORB_Core::lane_resources (void) -{ - return this->thread_lane_resources_manager ().lane_resources (); -} - -void -TAO_ORB_Core::resolve_typecodefactory_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Object_Loader *loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("TypeCodeFactory_Loader"); - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("TypeCodeFactory", - "TAO_TypeCodeFactory", - "_make_TAO_TypeCodeFactory_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("TypeCodeFactory_Loader"); - if (loader == 0) - ACE_THROW (CORBA::ORB::InvalidName ()); - } - this->typecode_factory_ = - loader->create_object (this->orb_, 0, 0 ACE_ENV_ARG_PARAMETER); -} - -void -TAO_ORB_Core::resolve_codecfactory_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Object_Loader *loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("CodecFactory_Loader"); - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("CodecFactory", - "TAO_CodecFactory", - "_make_TAO_CodecFactory_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("CodecFactory_Loader"); - } - if (loader != 0) - { - this->codec_factory_ = - loader->create_object (this->orb_, 0, 0 ACE_ENV_ARG_PARAMETER); - } -} - -#if TAO_HAS_INTERCEPTORS == 1 - -void -TAO_ORB_Core::resolve_picurrent_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Object_Loader *loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("PICurrent_Loader"); - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("PICurrent_Loader", - "TAO", - "_make_TAO_PICurrent_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("PICurrent_Loader"); - } - - if (loader != 0) - { - CORBA::Object_ptr pi = - loader->create_object (this->orb_, 0, 0 ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - this->pi_current_ = dynamic_cast <TAO::PICurrent *> (pi); - } -} - -#endif - - -void -TAO_ORB_Core::resolve_dynanyfactory_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Object_Loader *loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("DynamicAny_Loader"); - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("DynamicAny_Loader", - "TAO_DynamicAny", - "_make_TAO_DynamicAny_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("DynamicAny_Loader"); - } - - if (loader != 0) - { - this->dynany_factory_ = - loader->create_object (this->orb_, 0, 0 ACE_ENV_ARG_PARAMETER); - } -} - -void -TAO_ORB_Core::resolve_iormanipulation_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Object_Loader *loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("IORManip_Loader"); - - if (loader == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("IORManip_Loader", - "TAO_IORManip", - "_make_TAO_IORManip_Loader", - "")); - loader = - ACE_Dynamic_Service<TAO_Object_Loader>::instance ("IORManip_Loader"); - } - if (loader != 0) - { - this->ior_manip_factory_ = - loader->create_object (this->orb_, 0, 0 ACE_ENV_ARG_PARAMETER); - } -} - -void -TAO_ORB_Core::resolve_ior_table_i (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Adapter_Factory *factory = - ACE_Dynamic_Service<TAO_Adapter_Factory>::instance ("TAO_IORTable"); - if (factory == 0) - { - ACE_Service_Config::process_directive ( - ACE_DYNAMIC_SERVICE_DIRECTIVE("TAO_IORTable", - "TAO_IORTable", - "_make_TAO_Table_Adapter_Factory", - "")); - factory = - ACE_Dynamic_Service<TAO_Adapter_Factory>::instance ("TAO_IORTable"); - } - - if (factory != 0) - { - // @@ Not exception safe - TAO_Adapter *iortable_adapter = factory->create (this); - this->adapter_registry_.insert (iortable_adapter ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - - iortable_adapter->open (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK; - - this->ior_table_ = iortable_adapter->root (); - } -} - -int -TAO_ORB_Core::set_endpoint_helper (const ACE_CString &lane, - const ACE_CString &endpoints - ACE_ENV_ARG_DECL) -{ - if (this->orb_params ()->add_endpoints (lane, - endpoints) != 0) - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t)\n") - ACE_TEXT ("Invalid endpoint(s) specified:\n%s\n"), - ACE_TEXT_CHAR_TO_TCHAR(endpoints.c_str ()))); - ACE_THROW_RETURN (CORBA::BAD_PARAM ( - CORBA::SystemException::_tao_minor_code ( - TAO_ORB_CORE_INIT_LOCATION_CODE, - EINVAL), - CORBA::COMPLETED_NO), - -1); - } - - return 0; -} - -CORBA::Object_ptr -TAO_ORB_Core::resolve_rir (const char *name - ACE_ENV_ARG_DECL) -{ - // Get the table of initial references specified through - // -ORBInitRef. - ACE_CString ior; - ACE_CString object_id ((const char *) name); - - // Get the list of initial reference prefixes specified through - // -ORBDefaultInitRef. - CORBA::String_var default_init_ref = - this->orb_params ()->default_init_ref (); - - // Check if a DefaultInitRef was specified. - if (ACE_OS::strlen (default_init_ref.in ()) != 0) - { - static const char corbaloc_prefix[] = "corbaloc:"; - static const char mcast_prefix[] = "mcast:"; - char object_key_delimiter = 0; - - ACE_CString list_of_profiles (default_init_ref.in ()); - - // Check if the protocol is corbaloc: or mcast:. - // If it is, set the object_key_delimiter. - if ((ACE_OS::strncmp (default_init_ref.in (), - corbaloc_prefix, - sizeof corbaloc_prefix -1) == 0) || - (ACE_OS::strncmp (default_init_ref.in (), - mcast_prefix, - sizeof mcast_prefix -1) == 0)) - { - object_key_delimiter = '/'; - } - else - { - TAO_Connector_Registry *conn_reg = - this->connector_registry (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - - // Obtain the appropriate object key delimiter for the - // specified protocol. - object_key_delimiter = - conn_reg->object_key_delimiter (list_of_profiles.c_str ()); - } - - // Make sure that the default initial reference doesn't end - // with the object key delimiter character. - if (list_of_profiles[list_of_profiles.length() - 1] != - object_key_delimiter) - list_of_profiles += ACE_CString (object_key_delimiter); - - list_of_profiles += object_id; - - return this->orb ()->string_to_object (list_of_profiles.c_str () - ACE_ENV_ARG_PARAMETER); - } - - return CORBA::Object::_nil (); -} - -CORBA::ORB::ObjectIdList * -TAO_ORB_Core::list_initial_references (ACE_ENV_SINGLE_ARG_DECL) -{ - // Unsupported initial services should NOT be included in the below list! - static const char *initial_services[] = { TAO_LIST_OF_INITIAL_SERVICES }; - // Make sure the "terminating" zero is the last array element so - // that there is a stop condition when iterating through the list. - - static const size_t initial_services_size = - sizeof (initial_services) / sizeof (initial_services[0]); - - const size_t total_size = - initial_services_size - + this->init_ref_map_.current_size () - + this->object_ref_table_.current_size (); - - CORBA::ORB::ObjectIdList *tmp = 0; - - ACE_NEW_THROW_EX (tmp, - CORBA::ORB::ObjectIdList ( - static_cast<CORBA::ULong> (total_size)), - CORBA::NO_MEMORY ()); - ACE_CHECK_RETURN (0); - - CORBA::ORB::ObjectIdList_var list (tmp); - list->length (static_cast<CORBA::ULong> (total_size)); - - CORBA::ULong index = 0; - // Index for ObjectIdList members. - - // Iterate over the registered initial references. - for (index = 0; index < initial_services_size; ++index) - list[index] = initial_services[index]; - - // Now iterate over the initial references created by the user and - // add them to the sequence. - - // References registered via - // ORBInitInfo::register_initial_reference(). - TAO_Object_Ref_Table::Iterator obj_ref_end = - this->object_ref_table_.end (); - - for (TAO_Object_Ref_Table::Iterator i = this->object_ref_table_.begin (); - i != obj_ref_end; - ++i, ++index) - list[index] = CORBA::string_dup ((*i).ext_id_); - - // References registered via INS. - const InitRefMap::iterator end = this->init_ref_map_.end (); - - for (InitRefMap::iterator j = this-> init_ref_map_.begin (); - j != end; - ++j, ++index) - list[index] = (*j).ext_id_.c_str (); - - return list._retn (); -} - -// **************************************************************** -ACE_Allocator* -TAO_ORB_Core::input_cdr_dblock_allocator (void) -{ - return this->lane_resources ().input_cdr_dblock_allocator (); -} - -ACE_Allocator* -TAO_ORB_Core::input_cdr_buffer_allocator (void) -{ - return this->lane_resources ().input_cdr_buffer_allocator (); -} - -ACE_Allocator* -TAO_ORB_Core::input_cdr_msgblock_allocator (void) -{ - return this->lane_resources ().input_cdr_msgblock_allocator (); -} - -ACE_Allocator* -TAO_ORB_Core::output_cdr_dblock_allocator (void) -{ - - return this->lane_resources ().output_cdr_dblock_allocator (); -} - -ACE_Allocator* -TAO_ORB_Core::output_cdr_buffer_allocator (void) -{ - return this->lane_resources ().output_cdr_buffer_allocator (); -} - - -ACE_Allocator* -TAO_ORB_Core::output_cdr_msgblock_allocator (void) -{ - return this->lane_resources ().output_cdr_msgblock_allocator (); -} - - -ACE_Allocator * -TAO_ORB_Core::transport_message_buffer_allocator (void) -{ - return this->lane_resources ().transport_message_buffer_allocator (); -} - - -ACE_Data_Block* -TAO_ORB_Core::create_input_cdr_data_block (size_t size) -{ - - ACE_Allocator *dblock_allocator = 0; - ACE_Allocator *buffer_allocator = 0; - - dblock_allocator = - this->input_cdr_dblock_allocator (); - buffer_allocator = - this->input_cdr_buffer_allocator (); - - ACE_Lock* lock_strategy = 0; - if (this->resource_factory ()->use_locked_data_blocks ()) - { - lock_strategy = &this->data_block_lock_; - } - - return this->create_data_block_i (size, - buffer_allocator, - dblock_allocator, - lock_strategy); -} - -ACE_Data_Block * -TAO_ORB_Core::create_data_block_i (size_t size, - ACE_Allocator *buffer_allocator, - ACE_Allocator *dblock_allocator, - ACE_Lock *lock_strategy) -{ - ACE_Data_Block *nb = 0; - - ACE_NEW_MALLOC_RETURN ( - nb, - static_cast<ACE_Data_Block*> ( - dblock_allocator->malloc (sizeof (ACE_Data_Block))), - ACE_Data_Block (size, - ACE_Message_Block::MB_DATA, - 0, - buffer_allocator, - lock_strategy, - 0, - dblock_allocator), - 0); - - return nb; -} - -TAO_Connector_Registry * -TAO_ORB_Core::connector_registry (ACE_ENV_SINGLE_ARG_DECL) -{ - TAO_Connector_Registry *conn = - this->lane_resources ().connector_registry (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_CHECK_RETURN (0); - - return conn; -} - -ACE_Reactor * -TAO_ORB_Core::reactor (void) -{ - return this->leader_follower ().reactor (); -} - -CORBA::Object_ptr -TAO_ORB_Core::implrepo_service (void) -{ - if (!this->use_implrepo_) - return CORBA::Object::_nil (); - - if (CORBA::is_nil (this->implrepo_service_)) - { - - ACE_TRY_NEW_ENV - { - CORBA::Object_var temp = this->orb_->resolve_initial_references ("ImplRepoService" ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, ace_mon, this->lock_, CORBA::Object::_nil ()); - - // @@ Worry about assigning a different IOR? (brunsch) - this->implrepo_service_ = temp._retn (); - } - ACE_CATCHANY - { - // Just make sure that we have a null pointer. Ignore the exception anyway. - this->implrepo_service_ = CORBA::Object::_nil (); - } - ACE_ENDTRY; - } - - return CORBA::Object::_duplicate (this->implrepo_service_); -} - -void -TAO_ORB_Core::call_sync_scope_hook (TAO_Stub *stub, - bool &has_synchronization, - Messaging::SyncScope &scope) -{ - Sync_Scope_Hook sync_scope_hook = - TAO_ORB_Core_Static_Resources::instance ()->sync_scope_hook_; - - if (sync_scope_hook == 0) - { - has_synchronization = false; - return; - } - - (*sync_scope_hook) (this, stub, has_synchronization, scope); -} - -TAO_Sync_Strategy & -TAO_ORB_Core::get_sync_strategy (TAO_Stub *, - Messaging::SyncScope &scope) -{ - - if (scope == Messaging::SYNC_WITH_TRANSPORT - || scope == Messaging::SYNC_WITH_SERVER - || scope == Messaging::SYNC_WITH_TARGET) - { - return this->transport_sync_strategy (); - } - -#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) - - if (scope == Messaging::SYNC_NONE - || scope == TAO::SYNC_EAGER_BUFFERING) - { - return this->eager_buffering_sync_strategy (); - } - - if (scope == TAO::SYNC_DELAYED_BUFFERING) - { - return this->delayed_buffering_sync_strategy (); - } - -#endif /* TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1 */ - - return this->transport_sync_strategy (); -} - -void -TAO_ORB_Core::set_sync_scope_hook (Sync_Scope_Hook hook) -{ - TAO_ORB_Core_Static_Resources::instance ()-> sync_scope_hook_ = hook; -} - -void -TAO_ORB_Core::call_timeout_hook (TAO_Stub *stub, - bool &has_timeout, - ACE_Time_Value &time_value) -{ - Timeout_Hook timeout_hook = - TAO_ORB_Core_Static_Resources::instance ()->timeout_hook_; - - if (timeout_hook == 0) - { - has_timeout = false; - return; - } - (*timeout_hook) (this, stub, has_timeout, time_value); -} - -void -TAO_ORB_Core::set_timeout_hook (Timeout_Hook hook) -{ - // Saving the hook pointer so that we can use it later when needed. - TAO_ORB_Core_Static_Resources::instance ()->timeout_hook_ = hook; - - return; -} - -void -TAO_ORB_Core::connection_timeout (TAO_Stub *stub, - bool &has_timeout, - ACE_Time_Value &time_value) -{ - Timeout_Hook connection_timeout_hook = - TAO_ORB_Core_Static_Resources::instance ()->connection_timeout_hook_; - - if (connection_timeout_hook == 0) - { - has_timeout = false; - return; - } - - (*connection_timeout_hook) (this, stub, has_timeout, time_value); -} - -void -TAO_ORB_Core::connection_timeout_hook (Timeout_Hook hook) -{ - // Saving the hook pointer so that we can use it later when needed. - TAO_ORB_Core_Static_Resources::instance ()->connection_timeout_hook_ = hook; -} - -#if (TAO_HAS_CORBA_MESSAGING == 1) - -CORBA::Policy_ptr -TAO_ORB_Core::get_policy (CORBA::PolicyType type - ACE_ENV_ARG_DECL) -{ - CORBA::Policy_var result; - - TAO_Policy_Manager *policy_manager = - this->policy_manager (); - if (policy_manager != 0) - { - result = policy_manager->get_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - if (CORBA::is_nil (result.in ())) - { - result = - this->get_default_policies ()->get_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - return result._retn (); -} - -CORBA::Policy_ptr -TAO_ORB_Core::get_policy_including_current (CORBA::PolicyType type - ACE_ENV_ARG_DECL) -{ - TAO_Policy_Current &policy_current = - this->policy_current (); - - CORBA::Policy_var result = - policy_current.get_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - - if (CORBA::is_nil (result.in ())) - { - result = this->get_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - return result._retn (); -} - -CORBA::Policy_ptr -TAO_ORB_Core::get_cached_policy (TAO_Cached_Policy_Type type - ACE_ENV_ARG_DECL) -{ - CORBA::Policy_var result; - - TAO_Policy_Manager *policy_manager = - this->policy_manager (); - if (policy_manager != 0) - { - result = - policy_manager->get_cached_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - if (CORBA::is_nil (result.in ())) - { - result = - this->get_default_policies ()->get_cached_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - return result._retn (); -} - -CORBA::Policy_ptr -TAO_ORB_Core::get_cached_policy_including_current ( - TAO_Cached_Policy_Type type - ACE_ENV_ARG_DECL) -{ - TAO_Policy_Current &policy_current = - this->policy_current (); - - CORBA::Policy_var result = - policy_current.get_cached_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK (CORBA::Policy::_nil ()); - - if (CORBA::is_nil (result.in ())) - { - result = - this->get_cached_policy (type - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (CORBA::Policy::_nil ()); - } - - return result._retn (); -} - -#endif /* (TAO_HAS_CORBA_MESSAGING == 1) */ - -CORBA::Environment * -TAO_ORB_Core::default_environment (void) const -{ - return TAO_TSS_RESOURCES::instance ()->default_environment_; -} - -void -TAO_ORB_Core::default_environment (CORBA::Environment *env) -{ - TAO_TSS_RESOURCES::instance ()->default_environment_ = env; -} - -void -TAO_ORB_Core::add_interceptor ( - PortableInterceptor::IORInterceptor_ptr interceptor - ACE_ENV_ARG_DECL) -{ - if (this->ior_interceptor_adapter ()) - { - this->ior_interceptor_adapter_->add_interceptor (interceptor - ACE_ENV_ARG_PARAMETER); - ACE_CHECK; - } - else - { - ACE_ERROR ((LM_ERROR, - ACE_TEXT ("(%P|%t) %p\n"), - ACE_TEXT ("ERROR: ORB Core unable to find the ") - ACE_TEXT ("IORInterceptor Adapter Factory instance"))); - - ACE_THROW (CORBA::INTERNAL ()); - } -} - -TAO_IORInterceptor_Adapter * -TAO_ORB_Core::ior_interceptor_adapter (void) -{ - if (this->ior_interceptor_adapter_ == 0) - { - ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, - ace_mon, - this->lock_, - 0); - - if (this->ior_interceptor_adapter_ == 0) - { - ACE_DECLARE_NEW_CORBA_ENV; - ACE_TRY - { - TAO_IORInterceptor_Adapter_Factory * ior_ap_factory = - ACE_Dynamic_Service<TAO_IORInterceptor_Adapter_Factory>::instance ( - TAO_ORB_Core::iorinterceptor_adapter_factory_name () - ); - - if (ior_ap_factory) - { - this->ior_interceptor_adapter_ = - ior_ap_factory->create (ACE_ENV_SINGLE_ARG_PARAMETER); - ACE_TRY_CHECK; - } - } - ACE_CATCHANY - { - ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, - "(%P|%t) Cannot initialize the " - "ior_interceptor_adapter \n"); - } - ACE_ENDTRY; - ACE_CHECK_RETURN(0); - } - } - - return this->ior_interceptor_adapter_; -} - -// **************************************************************** - -TAO_ORB_Core_TSS_Resources::TAO_ORB_Core_TSS_Resources (void) - : event_loop_thread_ (0) - , client_leader_thread_ (0) - , lane_ (0) - , ts_objects_ () - , upcalls_temporarily_suspended_on_this_thread_ (false) - , orb_core_ (0) -#if TAO_HAS_INTERCEPTORS == 1 - , pi_current_ () - , client_request_info_ (0) -#endif /* TAO_HAS_INTERCEPTORS == 1 */ -{ -#if TAO_HAS_INTERCEPTORS == 1 - ACE_NEW (this->client_request_info_, - TAO_ClientRequestInfo); -#endif /* TAO_HAS_INTERCEPTORS == 1 */ -} - -TAO_ORB_Core_TSS_Resources::~TAO_ORB_Core_TSS_Resources (void) -{ - -#if TAO_HAS_INTERCEPTORS == 1 - CORBA::release (this->client_request_info_); -#endif /* TAO_HAS_INTERCEPTORS == 1 */ - - //@@ This is broken on platforms that use TSS emulation since this - // destructor is invoked after the ORB. Since we're under - // pressure to release a beta, we'll have to leak the TSS objects - // stores in the <ts_objects_> array. However, the only service - // known to currently use this array is the SSLIOP pluggable - // protocol. Fortunately, it registeres a null cleanup function - // so we're not leaking anything yet. We *do* need to fix this - // before other services start to use this array. - // -Ossama - // if (this->orb_core_ != 0) - // this->orb_core_->tss_cleanup_funcs ()->cleanup (this->ts_objects_); -} - -// **************************************************************** - -TAO_Export TAO_ORB_Core * -TAO_ORB_Core_instance (void) -{ - // @@ This is a slight violation of layering, we should use - // TAO_ORB_Core_instance(), but that breaks during startup. - TAO::ORB_Table * const orb_table = TAO::ORB_Table::instance (); - if (orb_table->first_orb () == 0) - { - ACE_MT (ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX, guard, - *ACE_Static_Object_Lock::instance (), 0)); - - if (orb_table->first_orb () == 0) - { - // Calling CORBA::ORB_init() returns a duplicated ORB - // reference, so make sure that reference is stored in an - // ORB_var so that no leak occurs. The duplicate ORB - // reference isn't needed outside the scope of this function - // since the corresponding ORB Core instance will still - // exist in the ORB table after the ORB reference is - // destroyed. - - ACE_DECLARE_NEW_CORBA_ENV; - ACE_TRY - { - int argc = 0; - CORBA::ORB_var orb = - CORBA::ORB_init (argc, 0, 0 ACE_ENV_ARG_PARAMETER); - ACE_TRY_CHECK; - } - ACE_CATCHANY - { - // @@ What should we do here? - } - ACE_ENDTRY; - } - } - - return orb_table->first_orb (); -} - - -TAO::Collocation_Strategy -TAO_ORB_Core::collocation_strategy (CORBA::Object_ptr object - ACE_ENV_ARG_DECL) -{ - TAO_Stub *stub = object->_stubobj (); - if (!CORBA::is_nil (stub->servant_orb_var ().in ()) && - stub->servant_orb_var ()->orb_core () != 0) - { - TAO_ORB_Core *orb_core = - stub->servant_orb_var ()->orb_core (); - - const int collocated = - orb_core->collocation_resolver ().is_collocated (object - ACE_ENV_ARG_PARAMETER); - ACE_CHECK_RETURN (TAO::TAO_CS_REMOTE_STRATEGY); - - if (collocated) - { - switch (stub->servant_orb_var ()->orb_core ()->get_collocation_strategy ()) - { - case THRU_POA: - return TAO::TAO_CS_THRU_POA_STRATEGY; - - case DIRECT: - { - ///////////////////////////////////////////////////////////// - // If the servant is null and you are collocated this means - // that the POA policy NON-RETAIN is set, and with that policy - // using the DIRECT collocation strategy is just insane. - ///////////////////////////////////////////////////////////// - ACE_ASSERT (object->_servant () != 0); - return TAO::TAO_CS_DIRECT_STRATEGY; - } - } - } - } - - // In this case the Object is a client. - return TAO::TAO_CS_REMOTE_STRATEGY; -} - -TAO_ORB_Core::InitRefMap * -TAO_ORB_Core::init_ref_map () -{ - return &this->init_ref_map_; -} - -void -TAO_ORB_Core::set_default (const char * orb_id) -{ - TAO::ORB_Table * const table = TAO::ORB_Table::instance (); - table->set_default (orb_id); -} - -void -TAO_ORB_Core::not_default (const char * orb_id) -{ - TAO::ORB_Table * const table = TAO::ORB_Table::instance (); - table->not_default (orb_id); -} - -/// Return the valuetype adapter -TAO_Valuetype_Adapter *& -TAO_ORB_Core::valuetype_adapter (void) -{ - return this->valuetype_adapter_; -} - -// **************************************************************** - -#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) - -template class ACE_Lock_Adapter<ACE_Null_Mutex>; -#if defined (ACE_HAS_THREADS) -template class ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX>; -template class ACE_Lock_Adapter<TAO_SYNCH_MUTEX>; -#endif /* ACE_HAS_THREADS */ - -template class ACE_Reverse_Lock<TAO_SYNCH_MUTEX>; -template class ACE_Guard<ACE_Reverse_Lock<TAO_SYNCH_MUTEX> >; - -template class ACE_TSS<TAO_ORB_Core_TSS_Resources>; - -template class ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Entry<ACE_CString, ACE_CString>; -template class ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; -template class ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex>; - -template class ACE_Array_Base<void *>; - -template class ACE_Dynamic_Service<TAO_Server_Strategy_Factory>; -template class ACE_Dynamic_Service<TAO_Client_Strategy_Factory>; - -#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) - -#pragma instantiate ACE_Lock_Adapter<ACE_Null_Mutex> -#if defined (ACE_HAS_THREADS) -#pragma instantiate ACE_Lock_Adapter<TAO_SYNCH_RECURSIVE_MUTEX> -#pragma instantiate ACE_Lock_Adapter<TAO_SYNCH_MUTEX> -#endif /* ACE_HAS_THREADS */ - -#pragma instantiate ACE_Reverse_Lock<TAO_SYNCH_MUTEX> -#pragma instantiate ACE_Guard<ACE_Reverse_Lock<TAO_SYNCH_MUTEX> > - -#pragma instantiate ACE_TSS<TAO_ORB_Core_TSS_Resources> - -#pragma instantiate ACE_Hash_Map_Manager_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Entry<ACE_CString, ACE_CString> -#pragma instantiate ACE_Hash_Map_Reverse_Iterator_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> -#pragma instantiate ACE_Hash_Map_Iterator_Base_Ex<ACE_CString, ACE_CString, ACE_Hash<ACE_CString>, ACE_Equal_To<ACE_CString>, ACE_Null_Mutex> - -#pragma instantiate ACE_Array_Base<void *> - -#pragma instantiate ACE_Dynamic_Service<TAO_Server_Strategy_Factory> -#pragma instantiate ACE_Dynamic_Service<TAO_Client_Strategy_Factory> - -#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ |