summaryrefslogtreecommitdiff
path: root/TAO/tao/ORB_Core.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/ORB_Core.cpp')
-rw-r--r--TAO/tao/ORB_Core.cpp2342
1 files changed, 0 insertions, 2342 deletions
diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp
deleted file mode 100644
index f8b5dae89ef..00000000000
--- a/TAO/tao/ORB_Core.cpp
+++ /dev/null
@@ -1,2342 +0,0 @@
-// $Id$
-
-#include "tao/ORB_Core.h"
-
-#include "ace/Env_Value_T.h"
-#include "ace/Arg_Shifter.h"
-#include "ace/Auto_Ptr.h"
-
-#include "tao/TAO_Internal.h"
-#include "tao/default_client.h"
-#include "tao/default_server.h"
-#include "tao/default_resource.h"
-#include "tao/debug.h"
-#include "tao/MProfile.h"
-#include "tao/Stub.h"
-#include "tao/Reactor_Registry.h"
-#include "tao/Leader_Follower.h"
-
-#include "tao/Connector_Registry.h"
-#include "tao/Acceptor_Registry.h"
-
-#include "tao/POA.h"
-
-#include "tao/Priority_Mapping.h"
-
-#include "ace/Object_Manager.h"
-#include "ace/Env_Value_T.h"
-#include "ace/Dynamic_Service.h"
-#include "ace/Arg_Shifter.h"
-#include "ace/INET_Addr.h"
-
-#include "tao/Sync_Strategies.h"
-
-#if defined(ACE_MVS)
-#include "ace/Codeset_IBM1047.h"
-#endif /* ACE_MVS */
-
-#if !defined (__ACE_INLINE__)
-# include "tao/ORB_Core.i"
-#endif /* ! __ACE_INLINE__ */
-
-ACE_RCSID(tao, ORB_Core, "$Id$")
-
-// ****************************************************************
-
-CORBA::Environment &
-TAO_default_environment ()
-{
- return *TAO_TSS_RESOURCES::instance ()->default_environment_;
-}
-
-// ****************************************************************
-
-TAO_ORB_Core::TAO_ORB_Core (const char *orbid)
- : lock_ (),
- connector_registry_ (0),
- acceptor_registry_ (0),
- protocol_factories_ (0),
- orb_ (),
- root_poa_ (0),
- root_poa_reference_ (),
- orb_params_ (),
- orbid_ (ACE_OS::strdup (orbid?orbid:"")),
- resource_factory_ (0),
- resource_factory_from_service_config_ (0),
- // @@ This is not needed since the default resource factory, fredk
- // is statically added to the service configurator.
- client_factory_ (0),
- client_factory_from_service_config_ (0),
- // @@ This is not needed since the default client factory, fredk
- // is statically added to the service configurator.
- server_factory_ (0),
- server_factory_from_service_config_ (0),
- // @@ This is not needed since the default server factory, fredk
- // is statically added to the service configurator.
- opt_for_collocation_ (1),
- use_global_collocation_ (1),
- collocation_strategy_ (THRU_POA),
-#if defined (TAO_HAS_CORBA_MESSAGING)
- policy_manager_ (0),
- default_policies_ (0),
- policy_current_ (0),
-#endif /* TAO_HAS_CORBA_MESSAGING */
- poa_current_ (0),
- object_adapter_ (0),
- tm_ (),
- from_iso8859_ (0),
- to_iso8859_ (0),
- from_unicode_ (0),
- to_unicode_ (0),
- use_tss_resources_ (0),
- tss_resources_ (),
- orb_resources_ (),
- reactor_registry_ (0),
- reactor_ (0),
- 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_ (),
- open_called_ (0),
- priority_mapping_ (0),
-#if defined (TAO_HAS_CORBA_MESSAGING)
- none_sync_strategy_ (0),
- flush_sync_strategy_ (0),
-#endif /* TAO_HAS_CORBA_MESSAGING */
- transport_sync_strategy_ (0),
- svc_config_argc_ (0),
- svc_config_argv_ (0)
-{
- ACE_NEW (this->poa_current_,
- TAO_POA_Current);
-
-#if defined(ACE_MVS)
- ACE_NEW (this->from_iso8859_, ACE_IBM1047_ISO8859);
- ACE_NEW (this->to_iso8859_, ACE_IBM1047_ISO8859);
-#endif /* ACE_MVS */
-
-#if defined (TAO_HAS_CORBA_MESSAGING)
-
- ACE_NEW (this->none_sync_strategy_,
- TAO_None_Sync_Strategy);
-
- ACE_NEW (this->flush_sync_strategy_,
- TAO_Flush_Sync_Strategy);
-
- ACE_NEW (this->policy_manager_,
- TAO_Policy_Manager);
-
- ACE_NEW (this->default_policies_,
- TAO_Policy_Manager_Impl);
-
- ACE_NEW (this->policy_current_,
- TAO_Policy_Current);
-
-#endif /* TAO_HAS_CORBA_MESSAGING */
-
- ACE_NEW (this->transport_sync_strategy_,
- TAO_Transport_Sync_Strategy);
-
-}
-
-TAO_ORB_Core::~TAO_ORB_Core (void)
-{
- ACE_OS::free (this->orbid_);
-
- delete this->from_iso8859_;
- delete this->to_iso8859_;
-
-#if defined (TAO_HAS_CORBA_MESSAGING)
-
- delete this->none_sync_strategy_;
- delete this->flush_sync_strategy_;
-
- delete this->policy_manager_;
- delete this->default_policies_;
- delete this->policy_current_;
-
-#endif /* TAO_HAS_CORBA_MESSAGING */
-
- delete this->transport_sync_strategy_;
-
- // This is deleted in init() so we should only get here if the
- // ORB_Core is destroyed prematurely.
- if (this->svc_config_argv_ != 0)
- {
- for (int i = 0; i < this->svc_config_argc_; i++)
- CORBA::string_free (this->svc_config_argv_[i]);
-
- this->svc_config_argc_ = 0;
- delete [] this->svc_config_argv_;
- }
-
- // Make sure these two objects are deleted last (other objects may
- // depend on this).
-#if !defined (__Lynx__) || !defined (__powerpc__)
- // This statement causes a seg fault on ORB shutdown, on LynxOS
- // 3.0.0/ppc only.
- delete this->poa_current_;
-#endif /* ! __Lynx__ || ! __powerpc__ */
-
- delete this->object_adapter_;
-}
-
-int
-TAO_ORB_Core::init (int &argc, char *argv[], CORBA::Environment &ACE_TRY_ENV)
-{
- // 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 ACE_Service_Config or the RootPOA.
- //
- // Prepare a copy of the argument vector for the service configurator.
-
- // @@ deprecated
- int old_style_endpoint = 0;
-
- ACE_NEW_THROW_EX (this->svc_config_argv_,
- char *[argc + 1],
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (-1);
-
- // Be certain to copy the program name so that service configurator
- // has something to skip!
- ACE_Arg_Shifter arg_shifter (argc, argv);
- const char *argv0 = "";
- if (argc > 0 && argv != 0)
- argv0 = argv[0];
- this->svc_config_argv_[this->svc_config_argc_++] = CORBA::string_dup (argv0);
-
- ACE_CString host;
- CORBA::UShort port = 0;
-
- // @@ GIOPLite should be an alternative ORB Messaging protocols, fredk
- int giop_lite = 0;
-
- CORBA::Boolean use_ior = 1;
- int cdr_tradeoff = ACE_DEFAULT_CDR_MEMCPY_TRADEOFF;
-
- // The following things should be changed to use the ACE_Env_Value<>
- // template sometime.
-
- // List of comma separated prefixes from ORBDefaultInitRef.
- ACE_CString default_init_ref;
-
- // Name Service port use for Multicast
- u_short ns_port = 0;
-
- // Trading Service port used for Multicast
- u_short ts_port = 0;
-
- // Implementation Repository Service port #.
- u_short ir_port = 0;
-
- // Mcast endpoint for the Naming Service discovery.
- ACE_CString mde;
-
- // 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
- size_t rcv_sock_size = 0;
- size_t snd_sock_size = 0;
-
- // Use TCP_NODELAY.
- size_t nodelay = 1;
-
- // Should we skip the <ACE_Service_Config::open> method, e.g., if we
- // already being configured by the ACE Service Configurator.
- int skip_service_config_open = 0;
-
- // 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 defined (TAO_USE_DOTTED_DECIMAL_ADDRESSES)
- 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 use_tss_resources = -1;
- // -1 is unknown, default to what the resource factory sets.
- // @@ This is just for backwards compatibility.
-
-#if defined (TAO_DEBUG)
- // Make it a little easier to debug programs using this code.
- {
- TAO_debug_level = ACE_Env_Value<u_int> ("TAO_ORB_DEBUG", 0);
-
- char *value = ACE_OS::getenv ("TAO_ORB_DEBUG");
-
- if (value != 0)
- {
- TAO_debug_level = ACE_OS::atoi (value);
- if (TAO_debug_level <= 0)
- TAO_debug_level = 1;
- ACE_DEBUG ((LM_DEBUG,
- "TAO_debug_level == %d", TAO_debug_level));
- }
- }
-#endif /* TAO_DEBUG */
-
- while (arg_shifter.is_anything_left ())
- {
- char *current_arg = 0;
-
- ////////////////////////////////////////////////////////////////
- // begin with the 'parameterless' flags //
- ////////////////////////////////////////////////////////////////
- if (arg_shifter.cur_arg_strncasecmp
- ("-ORBDaemon") != -1)
- {
- // Be a daemon
- this->svc_config_argv_[this->svc_config_argc_++] =
- CORBA::string_dup ("-b");
-
- arg_shifter.consume_arg ();
- }
- else if (arg_shifter.cur_arg_strncasecmp
- ("-ORBSkipServiceConfigOpen") != -1)
- {
- arg_shifter.consume_arg ();
-
- skip_service_config_open = 1;
- }
- else if (arg_shifter.cur_arg_strncasecmp ("-ORBGIOPlite") != -1)
- {
- // @@ This will have to change since gioplite
- // will be considered as an alternate ORB
- // messaging protocols.
- giop_lite = 1;
-
- arg_shifter.consume_arg ();
- }
-
- ////////////////////////////////////////////////////////////////
- // continue with the 'parameter' flags //
- ////////////////////////////////////////////////////////////////
- else if ((current_arg =
- arg_shifter.get_the_parameter ("-ORBSvcConf")))
- {
- // Specify the name of the svc.conf file to be used.
- this->svc_config_argv_[this->svc_config_argc_++] =
- CORBA::string_dup ("-f");
-
- this->svc_config_argv_[this->svc_config_argc_++] =
- CORBA::string_dup (current_arg);
-
- arg_shifter.consume_arg();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-ORBDebugLevel")))
- {
- TAO_debug_level =
- ACE_OS::atoi (current_arg);
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBDebug")))
- {
- // later, replace all of these
- // warning this turns on a daemon
- ACE::debug (1);
- TAO_orbdebug = 1;
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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 preconnect or endpoint strings should be of
- // the above form(s).
- //
- // Multiple sets of endpoint may be seperated by a semi-colon `;'.
- // For example:
- //
- // iioploc://space:2001,1.2@odyssey:2010;uiop://foo,bar
- //
- // All preconnect or endpoint strings should be of the above form(s).
-
- ACE_CString endpts (current_arg);
-
- if (this->orb_params ()->endpoints (endpts) != 0)
- {
- ACE_ERROR ((LM_ERROR,
- "(%P|%t)\n"
- "Invalid endpoint(s) specified:\n%s\n",
- endpts.c_str ()));
- ACE_THROW_RETURN (CORBA::BAD_PARAM (), -1);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBHost")))
- {
- // @@ This option now has the same effect as specifying
- // an extra -ORBendpoint. Ideally, this option
- // should be removed so that all INET specific
- // stuff can be removed from the ORB core but I
- // guess we need to leave it here for backward
- // compatibility. C'est la vie.
-
- old_style_endpoint = 1;
- // Specify the name of the host (i.e., interface) on which
- // the server should listen.
-
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `-ORBHost' option is obsolete.\n"
- "In the future, use the `-ORBEndpoint' option.\n"));
-
- host = current_arg;
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBNameServiceIOR")))
- {
- // Specify the IOR of the NameService.
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `-ORBNameServiceIOR' option "
- "is obsolete.\n"
- "Please use the `-ORBInitRef ' option instead.\n"));
-
- // Construct an argument that would be equivalent to
- // "-ORBInitRef NameService=....."
- ACE_CString init_ref =
- ACE_CString (TAO_OBJID_NAMESERVICE) +
- ACE_CString ('=') +
- ACE_CString (current_arg);
- if (this->orb_params ()->add_to_ior_table (init_ref) != 0)
- {
- ACE_ERROR ((LM_ERROR,
- "TAO (%P|%t) Unable to add the Name "
- "Service IOR <%s> to the lookup table.\n",
- current_arg));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-ORBMulticastDiscoveryEndpoint")))
- {
- // Specify mcast address:port for the Naming Service Multicast
- // Discovery Protocol.
-
- mde = current_arg;
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-ORBTradingServiceIOR")))
- {
- // Specify the IOR of the Trading Service.
-
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `-ORBTradingServiceIOR' "
- "option is obsolete.\n"
- "Please use the `-ORBInitRef' option instead.\n"));
-
- // Construct an argument that would be equivalent to
- // "-ORBInitRef TradingService=....."
-
- ACE_CString init_ref =
- ACE_CString (TAO_OBJID_TRADINGSERVICE) +
- ACE_CString ('=') +
- ACE_CString (current_arg);
-
- if (this->orb_params ()->add_to_ior_table (init_ref) != 0)
- {
- ACE_ERROR ((LM_ERROR,
- "TAO (%P|%t) Unable to add the Trading "
- "Service IOR <%s> to the lookup table.\n",
- current_arg));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-ORBImplRepoServiceIOR")))
- {
- // Specify the IOR of the Implementation Repository
-
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `-ORBImplRepoServiceIOR' "
- "option is obsolete.\n"
- "Please use the `-ORBInitRef' option instead.\n"));
-
- // Construct an argument that would be equivalent to
- // "-ORBInitRef ImplRepoService=....."
-
- ACE_CString init_ref =
- ACE_CString (TAO_OBJID_IMPLREPOSERVICE) +
- ACE_CString ('=') +
- ACE_CString (current_arg);
-
- if (this->orb_params ()->add_to_ior_table (init_ref) != 0)
- {
- ACE_ERROR ((LM_ERROR,
- "TAO (%P|%t) Unable to add the "
- "Implementation Repository IOR <%s> to "
- "the lookup table.\n",
- current_arg));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-ORBPort")))
- {
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
-
- old_style_endpoint = 1;
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `-ORBPort' option is obsolete.\n"
- "In the future, use the `-ORBEndpoint' option.\n"));
-
- // Specify the port number/name on which we should listen
- // We really shouldn't limit this to being specified as
- // an int, but oh well for now.
- port = (CORBA::UShort) ACE_OS::atoi (current_arg);
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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
- ("-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
- ("-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
- char *opt = current_arg;
- if (ACE_OS::strcasecmp (opt,
- "URL") == 0)
- use_ior = 0;
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBCollocationStrategy")))
- {
- // Specify which collocation policy we want to use.
- char *opt = current_arg;
- if (ACE_OS::strcasecmp (opt, "thru_poa") == 0)
- this->collocation_strategy_ = THRU_POA;
- else if (ACE_OS::strcasecmp (opt, "direct") == 0)
- this->collocation_strategy_ = DIRECT;
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBCollocation")))
- {
- // Specify whether we want to optimize against collocation
- // objects. Valid arguments are: "yes" and "no".
- // Default is yes.
-
- int yes_implies_global = 0;
-
- char *opt = current_arg;
- if (ACE_OS::strcasecmp (opt, "YES") == 0)
- {
- yes_implies_global = 1;
- ACE_DEBUG ((LM_WARNING,
- "WARNING: using '-ORBCollocation YES' is obsolete "
- "and implies '-ORBCollocation global'"
- " Please use '-ORBCollocation global' instead.\n"));
- }
-
- if (yes_implies_global ||
- ACE_OS::strcasecmp (opt, "global") == 0)
- {
- this->opt_for_collocation_ = 1;
- this->use_global_collocation_ = 1;
- }
- else if (ACE_OS::strcasecmp (opt, "NO") == 0)
- this->opt_for_collocation_ = 0;
- else if (ACE_OS::strcasecmp (opt, "per-orb") == 0)
- {
- this->opt_for_collocation_ = 1;
- this->use_global_collocation_ = 0;
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-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,
- "WARNING: -ORBGlobalCollocation option is obsolete."
- " Please use '-ORBCollocation global/per-orb/no'"
- "instead.\n"));
-
- char *opt = current_arg;
- if (ACE_OS::strcasecmp (opt, "YES") == 0)
- {
- this->use_global_collocation_ = 1;
- }
- else if (ACE_OS::strcasecmp (opt, "NO") == 0)
- {
- this->use_global_collocation_ = 0;
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBPreconnect")))
- {
- // Get a string which describes the connections we want to
- // cache up-front, thus reducing the latency of the first call.
- //
- // For example, specify -ORBpreconnect once for each
- // protocol:
- //
- // -ORBpreconnect iiop://tango:10015,watusi:10016
- // -ORBpreconnect busX_iop://board1:0x07450000,board2,0x08450000
- //
- // Or chain all possible endpoint designations together:
- //
- // -ORBpreconnect iiop://tango:10015,watusi:10016/;
- // busX_iop://board1:0x07450000,board2,0x08450000/
- //
- // The old style command line only works for IIOP:
- // -ORBpreconnect tango:10015,tango:10015,watusi:10016
-
- ACE_CString preconnections (current_arg);
-
- if (this->orb_params ()->preconnects (preconnections) != 0)
- {
- // Handle old style preconnects for backward compatibility.
- // The old style preconnects only work for IIOP!
-
- // Issue a warning since this backward compatibilty support
- // may be dropped in future releases.
-
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The `host:port' pair style "
- "for `-ORBPreconnect' is obsolete.\n"
- "In the future, use the URL style.\n"));
-
- preconnections =
- ACE_CString ("iiop://") +
- ACE_CString (preconnections);
-
- ACE_DEBUG ((LM_WARNING,
- "(%P|%t) \nWARNING: The following preconnection "
- "will be used:\n%s\n",
- preconnections.c_str()));
-
- this->orb_params ()->preconnects (preconnections);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBCDRTradeoff")))
- {
- cdr_tradeoff = ACE_OS::atoi (current_arg);
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBSvcConfDirective")))
- {
- // This is used to pass arguments to the Service
- // Configurator using the "command line" to provide
- // configuration information rather than using a svc.conf
- // file. Pass the "-S" to the service configurator.
- this->svc_config_argv_[this->svc_config_argc_++] =
- CORBA::string_dup ("-S");
-
- // Pass the next argument.
- this->svc_config_argv_[this->svc_config_argc_++] =
- CORBA::string_dup (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
- ("-ORBInitRef")))
- {
- ACE_CString init_ref (current_arg);
- if (this->orb_params ()->add_to_ior_table (init_ref) != 0)
- {
- ACE_ERROR ((LM_ERROR,
- "Unable to add initial reference:\n"
- "%s\n"
- "to the initial reference lookup table.\n",
- current_arg));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBDefaultInitRef")))
- {
- default_init_ref = current_arg;
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBStdProfileComponents")))
- {
- std_profile_components =
- ACE_OS::atoi (current_arg);
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBResources")))
- {
- char *opt = current_arg;
- if (ACE_OS::strcasecmp (opt, "global") == 0)
- {
- use_tss_resources = 0;
- }
- else if (ACE_OS::strcasecmp (opt, "tss") == 0)
- {
- use_tss_resources = 1;
- }
- arg_shifter.consume_arg ();
- }
- else if ((current_arg = arg_shifter.get_the_parameter
- ("-ORBLogFile")))
- {
- //
- // redirect all ACE_DEUBG and ACE_ERROR output to a file
- // USAGE: -ORBLogFile <file>
- // default: if <file> is present = append
- // if <file> is not present = create
- //
-
- ASYS_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, "a");
-
- ACE_LOG_MSG->msg_ostream (output_stream);
-
-#else /* ! ACE_LACKS_IOSTREAM_TOTALLY */
-
- ofstream* output_stream;
-
- //
- // note: we are allocating dynamic memory here....but
- // I assume it will persist for the life of the program
- //
-
- ACE_NEW_RETURN
- (output_stream,
- ofstream (),
- 1);
-
- output_stream->open (file_name, ios::out | ios::app);
-
- if (!output_stream->bad ())
- {
- ACE_LOG_MSG->msg_ostream (output_stream);
- }
-
-#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);
-
- }
-
- ////////////////////////////////////////////////////////////////
- // catch all the remaining -ORB args //
- ////////////////////////////////////////////////////////////////
- else if (arg_shifter.cur_arg_strncasecmp
- ("-ORB") != -1)
- {
- if (TAO_debug_level > 0)
- ACE_DEBUG ((LM_WARNING,
- "WARNING: Unknown \"-ORB\" option <%s>.\n"
- " Removing it from the argument list.\n",
- current_arg));
- arg_shifter.consume_arg ();
- }
-
- ////////////////////////////////////////////////////////////////
- // 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 ();
- }
-
-#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, SIG_IGN);
-#endif /* SIGPIPE */
-
- // Initialize the Service Configurator -check for return values.
- // Load the resource factory, connector registry, acceptor registry
- // and protocols. Will need to call the open () method on
- // the registries!
- int result = TAO_Internal::open_services (this->svc_config_argc_,
- this->svc_config_argv_,
- 0,
- skip_service_config_open);
-
- // Make sure to free up all the dynamically allocated memory. If we
- // decide we don't need to allocate this stuff dynamically then we
- // can remove this.
- for (int i = 0; i < this->svc_config_argc_; i++)
- CORBA::string_free (this->svc_config_argv_[i]);
-
- delete [] this->svc_config_argv_;
- this->svc_config_argc_ = 0;
- this->svc_config_argv_ = 0;
-
- // Check for errors returned from <TAO_Internal::open_services>.
- if (result != 0 && errno != ENOENT)
- {
- ACE_ERROR ((LM_ERROR,
- "(%P|%t) %p\n",
- "ORB Core unable to initialize the "
- "Service Configurator"));
- ACE_THROW_RETURN (CORBA::INITIALIZE (), -1);
- }
-
- // 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,
- "(%P|%t) %p\n",
- "ORB Core unable to find a Resource Factory instance"));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- if (use_tss_resources == -1)
- this->use_tss_resources_ = trf->use_tss_resources ();
- else
- this->use_tss_resources_ = use_tss_resources;
-
- this->reactor_registry_ =
- trf->get_reactor_registry ();
- this->reactor_registry_->open (this);
-
- this->priority_mapping_ =
- trf->get_priority_mapping ();
-
- // @@ ????
- // Make sure the reactor is initialized...
- ACE_Reactor *reactor = this->reactor ();
- if (reactor == 0)
- {
- ACE_ERROR ((LM_ERROR,
- "(%P|%t) %p\n",
- "ORB Core unable to initialize reactor"));
- ACE_THROW_RETURN (CORBA::INITIALIZE (), -1);
- }
-
- TAO_Server_Strategy_Factory *ssf = this->server_factory ();
-
- if (ssf == 0)
- {
- ACE_ERROR ((LM_ERROR,
- "(%P|%t) %p\n",
- "ORB Core unable to find a Server Strategy Factory "
- "instance"));
- ACE_THROW_RETURN (CORBA::INTERNAL (), -1);
- }
-
- ssf->open (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.
- CORBA::ORB_ptr temp_orb = CORBA::ORB::_nil ();
-
- ACE_NEW_THROW_EX (temp_orb,
- CORBA_ORB (this),
- CORBA::NO_MEMORY ());
- ACE_CHECK_RETURN (-1);
-
- this->orb_ = temp_orb;
-
- // This should probably move into the ORB Core someday rather then
- // being done at this level.
- this->orb_->_use_omg_ior_format (use_ior);
-
- // @@ Michael: I don't know if this is the best spot,
- // we might have to discuss that.
- //this->leader_follower_lock_ptr_ = this->client_factory ()
- // ->create_leader_follower_lock ();
-
- // Set all kinds of orb parameters whose setting needed to be
- // deferred until after the service config entries had been
- // determined.
-
- // @@ Set the endpoint string to iiop://host:port
- // Add a string to hold the endpoint designation for this ORB
- // for now it will be iiop://host:port
- // -fredk
- if (old_style_endpoint)
- {
- ACE_CString iiop_endpoint;
- if (this->set_iiop_endpoint (dotted_decimal_addresses,
- port,
- host,
- iiop_endpoint) == -1)
- ACE_THROW_RETURN (CORBA::BAD_PARAM (), -1);
- // Add the endpoint
- this->orb_params ()->endpoints (iiop_endpoint);
- }
-
- // Set the list of prefixes from -ORBDefaultInitRef.
- this->orb_params ()->default_init_ref (default_init_ref);
-
- this->orb_params ()->service_port (NAMESERVICE, ns_port);
- this->orb_params ()->service_port (TRADINGSERVICE, ts_port);
- this->orb_params ()->service_port (IMPLREPOSERVICE, ir_port);
-
- this->orb_params ()->mcast_discovery_endpoint (mde);
- this->orb_params ()->use_dotted_decimal_addresses (dotted_decimal_addresses);
- 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 ()->use_lite_protocol (giop_lite);
-
- 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 (), -1);
-
- // init the ORB core's pointer
- this->protocol_factories_ = trf->get_protocol_factories ();
-
- // Now that we have a complete list of available protocols and their
- // related factory objects, initialize the registries!
-
- // Initialize the connector registry and create a connector for each
- // configured protocol.
- if (this->connector_registry ()->open (this) != 0)
- ACE_THROW_RETURN (CORBA::INITIALIZE (), -1);
-
- // Have the connector registry parse the preconnects.
- if (this->orb_params ()->preconnects ().is_empty () == 0)
- this->connector_registry ()->preconnect (
- this,
- this->orb_params ()->preconnects ());
-
- // 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::set_iiop_endpoint (int dotted_decimal_addresses,
- CORBA::UShort port,
- ACE_CString &host,
- ACE_CString &endpoint)
-{
- // @@ It would be nice to get rid of this environment variable at
- // some point in the near future.
- // -Ossama
-
- // Check if the a default port has been specified by the user in an
- // environment variable.
- ACE_Env_Value<int> defport ("TAO_DEFAULT_SERVER_PORT",
- TAO_DEFAULT_SERVER_PORT);
-
- if (port == 0)
- port = ACE_static_cast (CORBA::UShort, defport);
-
- // No host specified; find it
- if (host.length () == 0)
- {
- ASYS_TCHAR name[MAXHOSTNAMELEN + 1];
- if (ACE_OS::hostname (name, MAXHOSTNAMELEN + 1) == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "failed to look up local host name"),
- -1);
- }
- host.set (name, 1);
- }
-
- // @@ For compatibility (ug) with how things were done before,
- // get the local host name in the correct format. This will be
- // stored away in the ORB! fredk
- ACE_INET_Addr rendezvous;
- rendezvous.set (port, host.c_str ());
-
- char buffer[MAXHOSTNAMELEN + 1];
-
- if (rendezvous.addr_to_string (buffer,
- MAXHOSTNAMELEN,
- dotted_decimal_addresses) == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "failed in addr_to_string ()"),
- -1);
- }
-
- // endpoint == iiop://host:port
- endpoint.set ("iiop://", 1);
- endpoint += buffer;
-
- return 0;
-}
-
-int
-TAO_ORB_Core::fini (void)
-{
- // Wait for any server threads, ignoring any failures.
- (void) this->thr_mgr ()->wait ();
-
- if (TAO_debug_level >= 3)
- {
- ACE_DEBUG ((LM_DEBUG,
- "Destroying ORB <%s>\n",
- this->orbid_));
- }
-
- // Close connectors before acceptors!
- // Ask the registry to close all registered connectors.
- if (this->connector_registry_ != 0)
- {
- this->connector_registry_->close_all ();
- delete this->connector_registry_;
- }
-
- // Ask the registry to close all registered acceptors.
- if (this->acceptor_registry_ != 0)
- {
- this->acceptor_registry_->close_all ();
- delete this->acceptor_registry_;
- }
-
- TAO_Internal::close_services ();
-
- // @@ This is not needed since the default resource factory
- // is statically added to the service configurator, fredk
- if (!this->resource_factory_from_service_config_)
- delete resource_factory_;
-
- // @@ This is not needed since the default client factory
- // is statically added to the service configurator, fredk
- if (!this->client_factory_from_service_config_)
- delete client_factory_;
-
- // @@ This is not needed since the default server factory
- // is statically added to the service configurator, fredk
- if (!this->server_factory_from_service_config_)
- delete server_factory_;
-
- {
- ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX, guard,
- *ACE_Static_Object_Lock::instance (), 0));
- TAO_ORB_Table::instance ()->unbind (this->orbid_);
- }
-
- delete this->reactor_registry_;
-#if defined(TAO_HAS_RT_CORBA)
- delete this->priority_mapping_;
-#endif /* TAO_HAS_RT_CORBA */
-
- delete this;
-
- return 0;
-}
-
-TAO_Resource_Factory *
-TAO_ORB_Core::resource_factory (void)
-{
- if (this->resource_factory_ == 0)
- {
- // Look in the service repository for an instance.
- this->resource_factory_ =
- ACE_Dynamic_Service<TAO_Resource_Factory>::instance (
- "Resource_Factory");
- // @@ Not needed!
- this->resource_factory_from_service_config_ = 1;
- }
-
- //@@ None of this stuff is needed since the default resource factory
- // is statically adde to the Service Configurator!
- if (this->resource_factory_ == 0)
- {
- // Still don't have one, so let's allocate the default. This
- // will throw an exception if it fails on exception-throwing
- // platforms.
- if (TAO_orbdebug)
- ACE_ERROR ((LM_WARNING,
- "(%P|%t) WARNING - No Resource Factory found "
- "in Service Repository.\n"
- " Using default instance with GLOBAL resource "
- "source specifier.\n"));
-
- TAO_Default_Resource_Factory *default_factory;
- ACE_NEW_RETURN (default_factory,
- TAO_Default_Resource_Factory,
- 0);
-
- // @@ Not needed.
- this->resource_factory_from_service_config_ = 0;
- this->resource_factory_ = default_factory;
-
- // @@ At this point we need to register this with the
- // Service_Repository in order to get it cleaned up properly.
- // But, for now we let it leak.
- }
- return this->resource_factory_;
-}
-
-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");
- // @@ Not needed!
- this->client_factory_from_service_config_ = 1;
- }
-
- //@@ None of this stuff is needed since the default client factory
- // is statically added to the Service Configurator, fredk
- if (this->client_factory_ == 0)
- {
- // Still don't have one, so let's allocate the default. This
- // will throw an exception if it fails on exception-throwing
- // platforms.
- if (TAO_orbdebug)
- ACE_ERROR ((LM_WARNING,
- "(%P|%t) WARNING - No Client Strategy Factory found "
- "in Service Repository.\n"
- " Using default instance.\n"));
-
- ACE_NEW_RETURN (this->client_factory_,
- TAO_Default_Client_Strategy_Factory,
- 0);
-
- this->client_factory_from_service_config_ = 0;
- // At this point we need to register this with the
- // Service_Repository in order to get it cleaned up properly.
- // But, for now we let it leak.
- }
- 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");
- // @@ Not needed!
- this->server_factory_from_service_config_ = 1;
- }
-
- //@@ None of this stuff is needed since the default server factory
- // is statically added to the Service Configurator, fredk
-
- // If the <server_factory_> isn't found it's usually because the ORB
- // hasn't been intialized correctly...
- if (this->server_factory_ == 0)
- {
- // Still don't have one, so let's allocate the default.
- if (TAO_orbdebug)
- ACE_ERROR ((LM_WARNING,
- "(%P|%t) WARNING - No %s found in Service Repository."
- " Using default instance.\n",
- "Server Strategy Factory"));
-
- ACE_NEW_RETURN (this->server_factory_,
- TAO_Default_Server_Strategy_Factory,
- 0);
-
- // @@ Not needed!
- this->server_factory_from_service_config_ = 0;
- // At this point we need to register this with the
- // <Service_Repository> to get it cleaned up properly. But, for
- // now we let it leak.
- }
-
- return this->server_factory_;
-}
-
-int
-TAO_ORB_Core::inherit_from_parent_thread (
- TAO_ORB_Core_TSS_Resources *tss_resources)
-{
- // Inherit properties/objects used in ORB_Core from the
- // parent thread. Stuff inherited here must already exist
- // in the "parent" orbcore.
- // This is used in the thread-per-connection concurrency model where
- // each ORB spawned thread must use the resources of the spawning
- // thread...
-
- if (tss_resources == 0)
- return -1;
-#if 0
- if (tss_resources->reactor_ != 0)
- {
- // We'll use the spawning thread's reactor.
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss->reactor_ != 0 && TAO_debug_level > 0)
- {
- ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) non nil reactor on thread startup!\n"));
-
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::inherit_from_parent_thread"
- " (); no more TSS keys"),
- -1);
-
- if (/* tss->owns_resources_ != 0 && */ !tss->inherited_reactor_)
- delete tss->reactor_;
- }
- tss->reactor_ = tss_resources->reactor_;
- tss->inherited_reactor_ = 1;
- }
-#endif /* 0 */
- // this->connection_cache (tss_resources->connection_cache_);
- // Inherit connection cache?
- return 0;
-}
-
-PortableServer::POA_ptr
-TAO_ORB_Core::root_poa_reference (CORBA::Environment &ACE_TRY_ENV,
- const char *adapter_name,
- TAO_POA_Manager *poa_manager,
- const TAO_POA_Policies *policies)
-{
- if (CORBA::is_nil (this->root_poa_reference_.in ()))
- {
- this->create_and_set_root_poa (adapter_name,
- poa_manager,
- policies,
- ACE_TRY_ENV);
- ACE_CHECK_RETURN (PortableServer::POA::_nil ());
- }
-
- return PortableServer::POA::_duplicate (this->root_poa_reference_.in ());
-}
-
-void
-TAO_ORB_Core::create_and_set_root_poa (const char *adapter_name,
- TAO_POA_Manager *poa_manager,
- const TAO_POA_Policies *policies,
- CORBA::Environment &ACE_TRY_ENV)
-{
- if (this->root_poa_ == 0)
- {
- // Double checked locking
- ACE_GUARD (ACE_SYNCH_MUTEX, ace_mon, this->lock_);
- if (this->root_poa_ == 0)
- {
- // Only set the auto_ptr if poa_manager is allocated here.
- auto_ptr<TAO_POA_Manager> safe_poa_manager;
- if (poa_manager == 0)
- {
- ACE_NEW_THROW_EX (poa_manager,
- TAO_POA_Manager (*this->object_adapter_i ()),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
-
- ACE_AUTO_PTR_RESET (safe_poa_manager,
- poa_manager,
- TAO_POA_Manager);
- }
-
- TAO_POA_Policies root_poa_policies;
- if (policies == 0)
- {
- // RootPOA policies defined in spec
- root_poa_policies.implicit_activation (
- PortableServer::IMPLICIT_ACTIVATION);
-
- policies = &root_poa_policies;
- }
-
- // Construct a new POA
- ACE_NEW_THROW_EX (this->root_poa_,
- TAO_POA (adapter_name,
- *poa_manager,
- *policies,
- 0,
- this->object_adapter_i ()->lock (),
- this->object_adapter_i ()->thread_lock (),
- *this,
- ACE_TRY_ENV),
- CORBA::NO_MEMORY ());
- ACE_CHECK;
-
- this->root_poa_reference_ =
- this->root_poa_->_this (ACE_TRY_ENV);
- ACE_CHECK;
-
- // Release the auto_ptr since we got here without error.
- poa_manager = safe_poa_manager.release ();
- }
- }
-}
-
-TAO_Object_Adapter *
-TAO_ORB_Core::object_adapter (void)
-{
- if (this->object_adapter_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- (void) this->object_adapter_i ();
- }
-
- return this->object_adapter_;
-}
-
-TAO_Object_Adapter *
-TAO_ORB_Core::object_adapter_i (void)
-{
- if (this->object_adapter_ == 0)
- {
- ACE_NEW_RETURN (this->object_adapter_,
- TAO_Object_Adapter (this->server_factory ()->
- active_object_map_creation_parameters (),
- *this),
- 0);
- }
- return this->object_adapter_;
-}
-
-ACE_SYNCH_CONDITION *
-TAO_ORB_Core::leader_follower_condition_variable (void)
-{
- // Always using TSS.
-
- // Get tss key.
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
-
- if (tss->leader_follower_condition_variable_ == 0)
- {
- // Create a new one and return.
- ACE_NEW_RETURN (tss->leader_follower_condition_variable_,
- ACE_SYNCH_CONDITION (this->leader_follower ().lock ()),
- 0);
- }
-
- return tss->leader_follower_condition_variable_;
-}
-
-TAO_Stub *
-TAO_ORB_Core::create_stub_object (const TAO_ObjectKey &key,
- const char *type_id,
- CORBA::Environment &ACE_TRY_ENV)
-{
- (void) this->open (ACE_TRY_ENV);
- ACE_CHECK_RETURN (0);
-
- CORBA::String_var id;
-
- if (type_id)
- id = CORBA::string_dup (type_id);
-
- TAO_Stub *stub = 0;
-
- size_t pfile_count =
- this->acceptor_registry ()->endpoint_count ();
-
- // First we create a profile list, well actually the empty container
- TAO_MProfile mp (pfile_count);
-
- if (this->acceptor_registry ()->make_mprofile (key, mp) == -1)
- ACE_THROW_RETURN (CORBA::INTERNAL (
- CORBA::SystemException::_tao_minor_code (
- TAO_MPROFILE_CREATION_ERROR,
- 0),
- CORBA::COMPLETED_NO),
- 0);
-
- ACE_NEW_THROW_EX (stub,
- TAO_Stub (id._retn (), mp, this),
- CORBA::NO_MEMORY (TAO_DEFAULT_MINOR_CODE,
- CORBA::COMPLETED_MAYBE));
- ACE_CHECK_RETURN (stub);
-
- return stub;
-}
-
-int
-TAO_ORB_Core::is_collocated (const TAO_MProfile& mprofile)
-{
- if (this->acceptor_registry_ == 0)
- return 0;
-
- // @@ 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->acceptor_registry_->is_collocated (mprofile);
-}
-
-// ****************************************************************
-
-TAO_Leader_Follower &
-TAO_ORB_Core::leader_follower (void)
-{
- return this->reactor_registry_->leader_follower ();
-}
-
-int
-TAO_ORB_Core::run (ACE_Time_Value *tv,
- int break_on_timeouts,
- CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- if (TAO_debug_level >= 3)
- ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) - start of run\n"));
-
- TAO_Leader_Follower &leader_follower = this->leader_follower ();
- {
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon,
- leader_follower.lock (), -1);
-
- leader_follower.set_server_thread ();
- }
-
- ACE_Reactor *r = this->reactor ();
-
- // @@ Do we really need to do this?
- // 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.
- r->owner (ACE_Thread::self ());
-
- // This method should only be called by servers, so now we set up
- // for listening!
-
- int ret = this->open (ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
-
- if (ret == -1)
- return -1;
-
- 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
- // of 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)
- {
- if (TAO_debug_level >= 3)
- ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) - blocking on handle events\n"));
- switch (r->handle_events (tv))
- {
- case 0: // Timed out, so we return to caller.
- if (break_on_timeouts)
- result = 0;
- break;
- /* NOTREACHED */
- case -1: // Something else has gone wrong, so return to caller.
- result = -1;
- break;
- /* NOTREACHED */
- default:
- // Some handlers were dispatched, so keep on processing
- // requests until we're told to shutdown .
- break;
- /* NOTREACHED */
- }
- if (result == 0 || result == -1)
- break;
- }
-
- {
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon,
- leader_follower.lock (), -1);
-
- leader_follower.reset_server_thread ();
-
- if (leader_follower.elect_new_leader () == -1)
- ACE_ERROR_RETURN ((LM_ERROR,
- "TAO (%P|%t) Failed to wake up "
- "a follower thread\n"),
- -1);
- }
-
- if (TAO_debug_level >= 3)
- ACE_DEBUG ((LM_DEBUG, "TAO (%P|%t) - end of run %d\n", result));
-
- return result;
-}
-
-void
-TAO_ORB_Core::shutdown (CORBA::Boolean wait_for_completion,
- CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- // Is the <wait_for_completion> semantics for this thread correct?
- TAO_POA::check_for_valid_wait_for_completions (wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // If the ORB::shutdown operation is called, it makes a call on
- // deactivate with a TRUE etherealize_objects parameter for each POA
- // manager known in the process; the wait_for_completion parameter
- // to deactivate will be the same as the similarly named parameter
- // of ORB::shutdown.
- this->object_adapter ()->deactivate (wait_for_completion,
- ACE_TRY_ENV);
- ACE_CHECK;
-
- // Set the shutdown flag
- this->has_shutdown_ = 1;
-
- // Shutdown all the reactors....
- this->reactor_registry_->shutdown_all ();
-
- // 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 ();
-}
-
-void
-TAO_ORB_Core::destroy (CORBA_Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- if (this->has_shutdown () == 0)
- {
- // Shutdown the ORB and block until the shutdown is complete.
- this->shutdown (1, ACE_TRY_ENV);
- ACE_CHECK;
- }
-
- // Now remove it from the ORB table so that it's ORBid may be
- // reused.
- {
- ACE_MT (ACE_GUARD (ACE_SYNCH_RECURSIVE_MUTEX, guard,
- *ACE_Static_Object_Lock::instance ()));
- TAO_ORB_Table::instance ()->unbind (this->orbid_);
- }
-
- // Destroy the ORB_Core.
- if (this->fini () != 0)
- {
- ACE_THROW (CORBA::INTERNAL (TAO_DEFAULT_MINOR_CODE,
- CORBA::COMPLETED_MAYBE));
- }
-}
-
-
-// Set up listening endpoints.
-
-int
-TAO_ORB_Core::open (CORBA::Environment &ACE_TRY_ENV)
- ACE_THROW_SPEC ((CORBA::SystemException))
-{
- // Double check pattern
- if (this->open_called_ == 1)
- return 1;
-
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, tao_mon, this->open_lock_, -1);
-
- if (this->open_called_ == 1)
- return 1;
-
- TAO_Acceptor_Registry *ar = this->acceptor_registry ();
- // get a reference to the acceptor_registry!
-
- int ret = ar->open (this, ACE_TRY_ENV);
- ACE_CHECK_RETURN (-1);
-
- if (ret == -1)
- return -1;
-
- this->open_called_ = 1;
-
- return 0;
-}
-
-// ****************************************************************
-
-#if defined (TAO_HAS_CORBA_MESSAGING)
-
-TAO_None_Sync_Strategy &
-TAO_ORB_Core::none_sync_strategy (void)
-{
- return *this->none_sync_strategy_;
-}
-
-TAO_Flush_Sync_Strategy &
-TAO_ORB_Core::flush_sync_strategy (void)
-{
- return *this->flush_sync_strategy_;
-}
-
-#endif /* TAO_HAS_CORBA_MESSAGING */
-
-TAO_Transport_Sync_Strategy &
-TAO_ORB_Core::transport_sync_strategy (void)
-{
- return *this->transport_sync_strategy_;
-}
-
-// ****************************************************************
-
-ACE_Allocator*
-TAO_ORB_Core::input_cdr_dblock_allocator_i (TAO_ORB_Core_TSS_Resources *tss)
-{
- if (tss->input_cdr_dblock_allocator_ == 0)
- tss->input_cdr_dblock_allocator_ =
- this->resource_factory ()->input_cdr_dblock_allocator ();
-
- return tss->input_cdr_dblock_allocator_;
-}
-
-ACE_Allocator*
-TAO_ORB_Core::input_cdr_dblock_allocator (void)
-{
- if (this->use_tss_resources_)
- {
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::input_cdr_dblock_allocator (); "
- "no more TSS keys"),
- 0);
- return this->input_cdr_dblock_allocator_i (tss);
- }
-
- if (this->orb_resources_.input_cdr_dblock_allocator_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->orb_resources_.input_cdr_dblock_allocator_ == 0)
- this->orb_resources_.input_cdr_dblock_allocator_ =
- this->resource_factory ()->input_cdr_dblock_allocator ();
- }
- return this->orb_resources_.input_cdr_dblock_allocator_;
-}
-
-ACE_Allocator*
-TAO_ORB_Core::input_cdr_buffer_allocator_i (TAO_ORB_Core_TSS_Resources *tss)
-{
- if (tss->input_cdr_buffer_allocator_ == 0)
- tss->input_cdr_buffer_allocator_ =
- this->resource_factory ()->input_cdr_buffer_allocator ();
-
- return tss->input_cdr_buffer_allocator_;
-}
-
-ACE_Allocator*
-TAO_ORB_Core::input_cdr_buffer_allocator (void)
-{
- if (this->use_tss_resources_)
- {
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::input_cdr_buffer_allocator (); "
- "no more TSS keys"),
- 0);
-
- return this->input_cdr_buffer_allocator_i (tss);
- }
-
- if (this->orb_resources_.input_cdr_buffer_allocator_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->orb_resources_.input_cdr_buffer_allocator_ == 0)
- this->orb_resources_.input_cdr_buffer_allocator_ =
- this->resource_factory ()->input_cdr_buffer_allocator ();
- }
- return this->orb_resources_.input_cdr_buffer_allocator_;
-}
-
-ACE_Allocator*
-TAO_ORB_Core::output_cdr_dblock_allocator (void)
-{
-#if 0
- if (this->use_tss_resources_)
-#endif /* 0 */
- {
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::output_cdr_dblock_allocator (); "
- "no more TSS keys"),
- 0);
-
- if (tss->output_cdr_dblock_allocator_ == 0)
- tss->output_cdr_dblock_allocator_ =
- this->resource_factory ()->output_cdr_dblock_allocator ();
-
- return tss->output_cdr_dblock_allocator_;
- }
-
-#if 0
- if (this->orb_resources_.output_cdr_dblock_allocator_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->orb_resources_.output_cdr_dblock_allocator_ == 0)
- this->orb_resources_.output_cdr_dblock_allocator_ =
- this->resource_factory ()->output_cdr_dblock_allocator ();
- }
- return this->orb_resources_.output_cdr_dblock_allocator_;
-#endif /* 0 */
-}
-
-ACE_Allocator*
-TAO_ORB_Core::output_cdr_buffer_allocator (void)
-{
-#if 0
- if (this->use_tss_resources_)
-#endif /* 0 */
- {
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::input_cdr_buffer_allocator (); "
- "no more TSS keys"),
- 0);
-
- if (tss->output_cdr_buffer_allocator_ == 0)
- tss->output_cdr_buffer_allocator_ =
- this->resource_factory ()->output_cdr_buffer_allocator ();
-
- return tss->output_cdr_buffer_allocator_;
- }
-
-#if 0
- if (this->orb_resources_.output_cdr_buffer_allocator_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->orb_resources_.output_cdr_buffer_allocator_ == 0)
- this->orb_resources_.output_cdr_buffer_allocator_ =
- this->resource_factory ()->output_cdr_buffer_allocator ();
- }
- return this->orb_resources_.output_cdr_buffer_allocator_;
-#endif /* 0 */
-}
-
-ACE_Data_Block*
-TAO_ORB_Core::create_input_cdr_data_block (size_t size)
-{
- ACE_Data_Block *nb = 0;
-
- ACE_Allocator *dblock_allocator;
- ACE_Allocator *buffer_allocator;
-
- if (this->use_tss_resources_)
- {
- TAO_ORB_Core_TSS_Resources *tss = this->get_tss_resources ();
- if (tss == 0)
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%P|%t) %p\n",
- "TAO_ORB_Core::create_input_cdr_data_block (); "
- "no more TSS keys"),
- 0);
-
- dblock_allocator =
- this->input_cdr_dblock_allocator_i (tss);
- buffer_allocator =
- this->input_cdr_buffer_allocator_i (tss);
- }
- else
- {
- 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_;
- }
-
- ACE_NEW_MALLOC_RETURN (
- nb,
- ACE_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;
-}
-
-ACE_Reactor *
-TAO_ORB_Core::reactor (void)
-{
- if (this->reactor_registry_ != 0)
- return this->reactor_registry_->reactor ();
-
- if (this->reactor_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->reactor_ == 0)
- {
- this->reactor_ =
- this->resource_factory ()->get_reactor ();
- }
- }
- return this->reactor_;
-}
-
-ACE_Reactor *
-TAO_ORB_Core::reactor (TAO_Acceptor *acceptor)
-{
- if (this->reactor_registry_ != 0)
- return this->reactor_registry_->reactor (acceptor);
-
- // @@ ????
- if (this->reactor_ == 0)
- {
- // Double checked locking
- ACE_GUARD_RETURN (ACE_SYNCH_MUTEX, ace_mon, this->lock_, 0);
- if (this->reactor_ == 0)
- {
- this->reactor_ =
- this->resource_factory ()->get_reactor ();
- }
- }
- return this->reactor_;
-}
-
-TAO_POA_Current &
-TAO_ORB_Core::poa_current (void) const
-{
- return *this->poa_current_;
-}
-
-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;
-}
-
-#if defined (TAO_HAS_CORBA_MESSAGING)
-
-TAO_Policy_Current &
-TAO_ORB_Core::policy_current (void)
-{
- return *this->policy_current_;
-}
-
-#endif /* TAO_HAS_CORBA_MESSAGING */
-
-#if defined (TAO_HAS_RT_CORBA)
-TAO_Priority_Mapping *
-TAO_ORB_Core::priority_mapping (void)
-{
- return this->priority_mapping_;
-}
-#endif /* TAO_HAS_RT_CORBA */
-
-int
-TAO_ORB_Core::get_thread_priority (CORBA::Short &priority)
-{
-#if !defined (TAO_HAS_RT_CORBA)
- priority = 0;
- return 0;
-#else
- ACE_hthread_t current;
- ACE_Thread::self (current);
-
- int native_priority;
- if (ACE_Thread::getprio (current, native_priority) == -1)
- {
- ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) - ORB_Core::get_thread_priority: "
- " ACE_Thread::get_prio\n"));
- return -1;
- }
-
- TAO_Priority_Mapping *priority_mapping =
- this->priority_mapping ();
-
- if (priority_mapping->to_CORBA (native_priority, priority) == 0)
- {
- ACE_DEBUG ((LM_DEBUG,
- "TAO (%P|%t) - ORB_Core::get_thread_priority: "
- " Priority_Mapping::to_CORBA\n"));
- return -1;
- }
-
- return 0;
-#endif /* TAO_HAS_RT_CORBA */
-}
-
-int
-TAO_ORB_Core::set_thread_priority (CORBA::Short priority)
-{
-#if !defined (TAO_HAS_RT_CORBA)
- ACE_UNUSED_ARG (priority);
- return 0;
-#else
- TAO_Priority_Mapping *priority_mapping =
- this->priority_mapping ();
-
- CORBA::Short native_priority;
- if (priority_mapping->to_native (priority, native_priority) == 0)
- return -1;
- ACE_hthread_t current;
- ACE_Thread::self (current);
-
- if (ACE_Thread::setprio (current, native_priority) == -1)
- return -1;
-
- return 0;
-#endif /* TAO_HAS_RT_CORBA */
-}
-
-// ****************************************************************
-
-TAO_ORB_Core_TSS_Resources::TAO_ORB_Core_TSS_Resources (void)
- : output_cdr_dblock_allocator_ (0),
- output_cdr_buffer_allocator_ (0),
- output_cdr_msgblock_allocator_ (0),
- input_cdr_dblock_allocator_ (0),
- input_cdr_buffer_allocator_ (0),
- connection_cache_ (0),
- is_server_thread_ (0),
- is_leader_thread_ (0),
- leader_follower_condition_variable_ (0),
- reactor_registry_ (0),
- reactor_registry_cookie_ (0)
-{
-}
-
-TAO_ORB_Core_TSS_Resources::~TAO_ORB_Core_TSS_Resources (void)
-{
- if (this->output_cdr_dblock_allocator_ != 0)
- this->output_cdr_dblock_allocator_->remove ();
- delete this->output_cdr_dblock_allocator_;
-
- if (this->output_cdr_buffer_allocator_ != 0)
- this->output_cdr_buffer_allocator_->remove ();
- delete this->output_cdr_buffer_allocator_;
-
- if (this->output_cdr_msgblock_allocator_ != 0)
- this->output_cdr_msgblock_allocator_->remove ();
- delete this->output_cdr_msgblock_allocator_;
-
- if (this->input_cdr_dblock_allocator_ != 0)
- this->input_cdr_dblock_allocator_->remove ();
- delete this->input_cdr_dblock_allocator_;
-
- if (this->input_cdr_buffer_allocator_ != 0)
- this->input_cdr_buffer_allocator_->remove ();
- delete this->input_cdr_buffer_allocator_;
-
- // UNIMPLEMENTED delete this->connection_cache_;
- this->connection_cache_ = 0;
-
- delete this->leader_follower_condition_variable_;
- this->leader_follower_condition_variable_ = 0;
-
- if (this->reactor_registry_ != 0)
- this->reactor_registry_->destroy_tss_cookie (this->reactor_registry_cookie_);
-}
-
-// ****************************************************************
-
-TAO_TSS_Resources::TAO_TSS_Resources (void)
- : poa_current_impl_ (0),
- default_environment_ (&this->tss_environment_)
-#if defined (TAO_HAS_CORBA_MESSAGING)
- , policy_current_ (&this->initial_policy_current_)
-#endif /* TAO_HAS_CORBA_MESSAGING */
-{
-}
-
-TAO_TSS_Resources::~TAO_TSS_Resources (void)
-{
-}
-
-// ****************************************************************
-
-TAO_ORB_Table::TAO_ORB_Table (void)
- : first_orb_ (0)
-{
-}
-
-TAO_ORB_Table::~TAO_ORB_Table (void)
-{
- for (Iterator i = this->begin ();
- i != this->end ();
- i = this->begin ())
- {
- // Destroy the ORB_Core
- (*i).int_id_->fini ();
- }
- this->table_.close ();
-
- // free up all the ORB owned Exceptions
- TAO_Exceptions::fini ();
-
- // free up all the ORB owned TypeCodes
- TAO_TypeCodes::fini ();
-}
-
-TAO_ORB_Table::Iterator
-TAO_ORB_Table::begin (void)
-{
- return this->table_.begin ();
-}
-
-TAO_ORB_Table::Iterator
-TAO_ORB_Table::end (void)
-{
- return this->table_.end ();
-}
-
-int
-TAO_ORB_Table::bind (const char *orb_id,
- TAO_ORB_Core *orb_core)
-{
- if (this->first_orb_ == 0)
- {
- this->first_orb_ = orb_core;
- }
- ACE_CString id (orb_id);
- return this->table_.bind (id, orb_core);
-}
-
-TAO_ORB_Core*
-TAO_ORB_Table::find (const char *orb_id)
-{
- TAO_ORB_Core *found = 0;
- ACE_CString id (orb_id);
- this->table_.find (id, found);
- return found;
-}
-
-int
-TAO_ORB_Table::unbind (const char *orb_id)
-{
- ACE_CString id (orb_id);
- TAO_ORB_Core *orb_core;
- int result = this->table_.unbind (id, orb_core);
- if (result == 0)
- {
- if (orb_core == this->first_orb_)
- {
- Iterator begin = this->begin ();
- Iterator end = this->end ();
- if (begin != end)
- this->first_orb_ = (*begin).int_id_;
- }
- }
- return result;
-}
-
-// ****************************************************************
-
-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 *orb_table = TAO_ORB_Table::instance ();
- if (orb_table->first_orb () == 0)
- {
- ACE_MT (ACE_GUARD_RETURN (ACE_SYNCH_RECURSIVE_MUTEX, guard,
- *ACE_Static_Object_Lock::instance (), 0));
-
- if (orb_table->first_orb () == 0)
- {
- int argc = 0;
- ACE_DECLARE_NEW_CORBA_ENV;
- ACE_TRY
- {
- (void) CORBA::ORB_init (argc, 0, 0, ACE_TRY_ENV);
- ACE_TRY_CHECK;
- }
- ACE_CATCHANY
- {
- // @@ What should we do here?
- }
- ACE_ENDTRY;
- }
- }
-
- return orb_table->first_orb ();
-}
-
-// ****************************************************************
-
-#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
-
-template class ACE_Reverse_Lock<ACE_SYNCH_MUTEX>;
-template class ACE_Guard<ACE_Reverse_Lock<ACE_SYNCH_MUTEX> >;
-
-template class ACE_Env_Value<int>;
-template class ACE_Env_Value<u_int>;
-
-template class ACE_TSS_Singleton<TAO_TSS_Resources, ACE_SYNCH_MUTEX>;
-template class ACE_TSS<TAO_TSS_Resources>;
-template class ACE_TSS<TAO_ORB_Core_TSS_Resources>;
-
-template class ACE_Singleton<TAO_ORB_Table,ACE_SYNCH_MUTEX>;
-template class ACE_Map_Entry<ACE_CString,TAO_ORB_Core*>;
-template class ACE_Map_Manager<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>;
-template class ACE_Map_Iterator_Base<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>;
-template class ACE_Map_Iterator<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>;
-template class ACE_Map_Reverse_Iterator<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>;
-
-#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
-
-#pragma instantiate ACE_Reverse_Lock<ACE_SYNCH_MUTEX>
-#pragma instantiate ACE_Guard<ACE_Reverse_Lock<ACE_SYNCH_MUTEX> >
-
-#pragma instantiate ACE_Env_Value<int>
-#pragma instantiate ACE_Env_Value<u_int>
-
-#pragma instantiate ACE_TSS_Singleton<TAO_TSS_Resources, ACE_SYNCH_MUTEX>
-#pragma instantiate ACE_TSS<TAO_TSS_Resources>
-#pragma instantiate ACE_TSS<TAO_ORB_Core_TSS_Resources>
-
-#pragma instantiate ACE_Singleton<TAO_ORB_Table,ACE_SYNCH_MUTEX>
-#pragma instantiate ACE_Map_Entry<ACE_CString,TAO_ORB_Core*>
-#pragma instantiate ACE_Map_Manager<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator_Base<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Iterator<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>
-#pragma instantiate ACE_Map_Reverse_Iterator<ACE_CString,TAO_ORB_Core*,ACE_Null_Mutex>
-
-#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */