summaryrefslogtreecommitdiff
path: root/TAO/tao/ORB.h
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/ORB.h')
-rw-r--r--TAO/tao/ORB.h674
1 files changed, 674 insertions, 0 deletions
diff --git a/TAO/tao/ORB.h b/TAO/tao/ORB.h
new file mode 100644
index 00000000000..8501413f64d
--- /dev/null
+++ b/TAO/tao/ORB.h
@@ -0,0 +1,674 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file ORB.h
+ *
+ * $Id$
+ *
+ * Header file for CORBA's ORB type.
+ *
+ * @author DOC Center - Washington University at St. Louis
+ * @author DOC Group - Vanderbilt University
+ * @author DOC Laboratory - University of California at Irvine
+ */
+//=============================================================================
+
+#ifndef TAO_ORB_H
+#define TAO_ORB_H
+
+#include /**/ "ace/pre.h"
+
+#include "tao/UserException.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+#include "tao/orb_typesC.h"
+#include "tao/objectid.h"
+#include "tao/CORBA_methods.h"
+#include "tao/VarOut_T.h"
+#include "tao/Seq_Var_T.h"
+#include "tao/Seq_Out_T.h"
+#include "tao/Sequence_T.h"
+#include "tao/Policy_ForwardC.h"
+#include "tao/ServicesC.h"
+
+#include "ace/Thread_Mutex.h"
+#include "ace/Guard_T.h"
+#include "ace/Atomic_Op.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+typedef enum
+{
+ TAO_SERVICEID_NAMESERVICE,
+ TAO_SERVICEID_TRADINGSERVICE,
+ TAO_SERVICEID_IMPLREPOSERVICE,
+ TAO_SERVICEID_INTERFACEREPOSERVICE,
+ TAO_SERVICEID_MCASTSERVER
+} TAO_Service_ID;
+
+/// Forward declarations.
+class TAO_MProfile;
+class TAO_Client_Strategy_Factory;
+class TAO_Server_Strategy_Factory;
+class TAO_InputCDR;
+class TAO_OutputCDR;
+class TAO_Stub;
+class TAO_Valuetype_Adapter;
+class TAO_Acceptor_Filter;
+
+// ****************************************************************
+
+namespace CORBA
+{
+ class EnumMemberSeq;
+ class StructMemberSeq;
+ class UnionMemberSeq;
+ class ValueMemberSeq;
+ class ORB_ObjectIdList;
+
+ class ExceptionList;
+ typedef ExceptionList * ExceptionList_ptr;
+
+ class ContextList;
+ typedef ContextList * ContextList_ptr;
+
+ class Context;
+ typedef Context * Context_ptr;
+
+ class NVList;
+ typedef NVList *NVList_ptr;
+
+ class NamedValue;
+ typedef NamedValue *NamedValue_ptr;
+
+ class Policy;
+ typedef Policy *Policy_ptr;
+
+ typedef CORBA::ULong PolicyType;
+
+ // TODO - implement OMG's 'ORBid CORBA::ORB::id (void)'.
+
+ typedef
+ TAO_VarSeq_Var_T<
+ ORB_ObjectIdList
+ >
+ ORB_ObjectIdList_var;
+
+ typedef
+ TAO_Seq_Out_T<
+ ORB_ObjectIdList
+ >
+ ORB_ObjectIdList_out;
+
+ class ValueFactoryBase;
+ typedef ValueFactoryBase *ValueFactory;
+
+ typedef UShort ServiceType;
+
+ class Request;
+ typedef Request * Request_ptr;
+ typedef TAO_Pseudo_Var_T<Request> Request_var;
+ typedef TAO_Pseudo_Out_T<Request> Request_out;
+
+ class ORB;
+ typedef ORB * ORB_ptr;
+ typedef TAO_Pseudo_Var_T<ORB> ORB_var;
+ typedef TAO_Pseudo_Out_T<ORB> ORB_out;
+
+ typedef CORBA::Short ValueModifier;
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+
+ // Typedefs for CORBA::RequestSeq, which is an argument of
+ // send_multiple_requests_*().
+
+ typedef
+ TAO::unbounded_object_reference_sequence<
+ CORBA::Request, CORBA::Request_var
+ >
+ RequestSeq;
+
+ typedef
+ TAO_VarSeq_Var_T<
+ RequestSeq
+ >
+ RequestSeq_var;
+
+ typedef
+ TAO_Seq_Out_T<
+ RequestSeq
+ >
+ RequestSeq_out;
+#endif
+
+ /**
+ * @class ORB
+ *
+ * @brief ORB pseudo-object.
+ *
+ * The "ORB" pseudo-object is used in bootstrapping, such as to
+ * create object references from strings. This class is intended
+ * to be inherited by others, which will provide some more of the
+ * CORBA support. Implementations of this "CORBA::ORB" class must
+ * know how to create stringify/destringify their objrefs, as well
+ * as how to marshal and unmarshal them.
+ */
+ class TAO_Export ORB
+ {
+ public:
+
+ class TAO_Export InvalidName : public CORBA::UserException
+ {
+ public:
+ InvalidName (void);
+ InvalidName (const InvalidName &);
+ ~InvalidName (void);
+
+ InvalidName &operator= (const InvalidName &);
+
+ static InvalidName *_downcast (CORBA::Exception *);
+ static CORBA::Exception *_alloc (void);
+
+ virtual CORBA::Exception *_tao_duplicate (void) const;
+
+ virtual void _raise (void) const;
+
+ virtual void _tao_encode (TAO_OutputCDR &
+ ACE_ENV_ARG_DECL) const;
+
+ virtual void _tao_decode (TAO_InputCDR &
+ ACE_ENV_ARG_DECL);
+ };
+
+ typedef char *ObjectId;
+ typedef CORBA::String_var ObjectId_var;
+ typedef CORBA::String_out ObjectId_out;
+ static CORBA::TypeCode_ptr const _tc_ObjectId;
+
+ typedef CORBA::ORB_ObjectIdList ObjectIdList;
+ typedef CORBA::ORB_ObjectIdList_var ObjectIdList_var;
+ typedef CORBA::ORB_ObjectIdList_out ObjectIdList_out;
+ typedef CORBA::ORB_ObjectIdList *ObjectIdList_ptr;
+ static CORBA::TypeCode_ptr const _tc_ObjectIdList;
+
+ /// Return a duplicate of @c orb.
+ /**
+ * When work with this duplicate is complete, it should be freed
+ * up using CORBA::release().
+ */
+ static CORBA::ORB_ptr _duplicate (CORBA::ORB_ptr orb);
+
+ /// Returns a pointer to a nil ORB, i.e., an non-existent ORB. This
+ /// can be used for initialization or in comparisons.
+ static CORBA::ORB_ptr _nil (void);
+
+ /// Return this ORB's ORBid.
+ char * id (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * Turn a string-ified object reference back into an object
+ * pointer. Typically these strings are created using
+ * object_to_string(), but not necessarily locally.
+ */
+ CORBA::Object_ptr string_to_object (const char *str
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * Turn an object reference into a string. Each type of ORB,
+ * e.g. an IIOP ORB, must implement this. This can be used by
+ * servers to publish their whereabouts to clients. The output of
+ * this is typically eventually given to @c string_to_object() as
+ * an argument.
+ */
+ char * object_to_string (CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+#if !defined(CORBA_E_MICRO)
+ // Value factory operations (CORBA 2.3 ptc/98-10-05 Ch. 4.2 p.4-7)
+ CORBA::ValueFactory register_value_factory (
+ const char *repository_id,
+ CORBA::ValueFactory factory
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif
+
+#if !defined(CORBA_E_MICRO)
+ void unregister_value_factory (const char * repository_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif
+
+#if !defined(CORBA_E_MICRO)
+ CORBA::ValueFactory lookup_value_factory (
+ const char *repository_id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif
+
+#if (TAO_HAS_MINIMUM_CORBA == 0)
+
+ void create_list (CORBA::Long count,
+ CORBA::NVList_ptr &new_list
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void create_operation_list(CORBA::OperationDef_ptr opDef,
+ CORBA::NVList_ptr& result
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void create_named_value (CORBA::NamedValue_ptr &nmval
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void create_exception_list (CORBA::ExceptionList_ptr &exclist
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void create_environment (CORBA::Environment_ptr &new_env
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ // The following are not implemented and just throw
+ // CORBA::NO_IMPLEMENT.
+
+ void create_context_list (CORBA::ContextList_ptr &ctxtlist
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void get_default_context (CORBA::Context_ptr &ctx
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::Boolean get_service_information (
+ CORBA::ServiceType service_type,
+ CORBA::ServiceInformation_out service_information
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void send_multiple_requests_oneway (const CORBA::RequestSeq &req
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void send_multiple_requests_deferred (const CORBA::RequestSeq &req
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ void get_next_response (CORBA::Request_ptr &req
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::Boolean poll_next_response (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// The ORB TypeCode creation functions.
+
+ CORBA::TypeCode_ptr create_struct_tc (
+ const char *id,
+ const char *name,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_union_tc (
+ const char *id,
+ const char *name,
+ CORBA::TypeCode_ptr discriminator_type,
+ const CORBA::UnionMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_enum_tc (
+ const char *id,
+ const char *name,
+ const CORBA::EnumMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_alias_tc (
+ const char *id,
+ const char *name,
+ CORBA::TypeCode_ptr original_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_exception_tc (
+ const char *id,
+ const char *name,
+ const CORBA::StructMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_interface_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_string_tc (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_wstring_tc (
+ CORBA::ULong bound
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_fixed_tc (
+ CORBA::UShort digits,
+ CORBA::UShort scale
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_sequence_tc (
+ CORBA::ULong bound,
+ CORBA::TypeCode_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_array_tc (
+ CORBA::ULong length,
+ CORBA::TypeCode_ptr element_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_value_tc (
+ const char *id,
+ const char *name,
+ CORBA::ValueModifier type_modifier,
+ CORBA::TypeCode_ptr concrete_base,
+ const CORBA::ValueMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_value_box_tc (
+ const char *id,
+ const char *name,
+ CORBA::TypeCode_ptr boxed_type
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_native_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_recursive_tc (
+ const char *id
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_abstract_interface_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_local_interface_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_component_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::TypeCode_ptr create_home_tc (
+ const char *id,
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ CORBA::TypeCode_ptr create_event_tc (
+ const char *id,
+ const char *name,
+ CORBA::ValueModifier type_modifier,
+ CORBA::TypeCode_ptr concrete_base,
+ const CORBA::ValueMemberSeq &members
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+#endif /* TAO_HAS_MINIMUM_CORBA */
+
+ // = ORB event loop methods.
+
+ /**
+ * Instructs the ORB to initialize itself and run its event loop in
+ * the current thread, not returning until the ORB has shut down.
+ * If an error occurs during initialization or at runtime, a CORBA
+ * system exception will be thrown.
+ */
+ void run (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * Instructs the ORB to initialize itself and run its event loop in
+ * the current thread, not returning until the ORB has shut down or
+ * the time value specified through @a tv has expired. If an
+ * error occurs during initialization or at runtime, a CORBA
+ * system exception will be thrown. @a tv is reduced by the
+ * amount of time spent in this call.
+ *
+ * If this function is called with a @ tv value, client threads
+ * making invocations will continue their operations. When the
+ * operation timesout and returns, any invocations showing up on
+ * the server will be buffered by TCP.
+ **/
+ void run (ACE_Time_Value &tv
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * Instructs the ORB to initialize itself and run its event loop in
+ * the current thread, not returning until the ORB has shut down or
+ * the time value specified through @a tv has expired. If an error
+ * occurs during initialization or at runtime, a CORBA system
+ * exception will be thrown. @a tv is reduced by the amount of time
+ * spent in this call. If @a tv is 0, it means that the timeout
+ * is infinite. If @a tv is @c ACE_Time_Value::zero, it specifies
+ * to poll and does not block.
+ *
+ * If this function is called with @a tv value, client threads
+ * making invocations will continue their operations. When the
+ * operation timesout and returns, any invocations showing up on
+ * the server will be buffered by TCP.
+ **/
+ void run (ACE_Time_Value *tv
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns an indication of whether the ORB needs to perform some
+ /// work.
+ CORBA::Boolean work_pending (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ /// Returns an indication of whether the ORB needs to perform some
+ /// work but will look for work pending for no more than the
+ /// specified time.
+ /**
+ * @note This is useful for implementing an event loop with an
+ * idle timeout.
+ */
+ CORBA::Boolean work_pending (ACE_Time_Value &tv
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * This operation performs an implementation-defined unit of work.
+ * Note that the default behavior is to block if the unit of work
+ * is not present; this behavior can be modified by passing an
+ * appropriate @c ACE_Time_Value as described in run().
+ **/
+ void perform_work (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+ void perform_work (ACE_Time_Value &tv
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+ void perform_work (ACE_Time_Value *tv
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * This operation instructs the ORB to shut down. Shutting down the
+ * ORB causes all Object Adapters to be shut down. If
+ * @c wait_for_completion parameter is TRUE, this operation blocks
+ * until all ORB processing (including request processing and object
+ * deactivation or other operations associated with object adapters)
+ * has completed.
+ */
+ void shutdown (CORBA::Boolean wait_for_completion = false
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+ /**
+ * Explicitly destroy the ORB, releasing any resources. Note that
+ * TAO *cannot* implicitly release the resources even if you have
+ * destroyed all the references to a particular ORB since
+ * CORBA::ORB_init() is required to return the same pointer if
+ * called with the same ORBid, only after ORB::destroy() is called
+ * it may return a new one.
+ *
+ * The results of multi-threaded applications, trying to destroy ()
+ * the ORB in one thread and trying to service a request in another
+ * thread are not well defined. TAO does not support such cases.
+ */
+ void destroy (ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+ CORBA::Object_ptr resolve_initial_references (
+ const char *name
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS
+ );
+
+ /**
+ * This method acts as a mini-bootstrapping Naming Service, which is
+ * provided by the ORB for certain well-known object references. TAO
+ * supports the "NameService", "TradingService", "RootPOA",
+ * "ImplRepo", and "POACurrent" via this method. The @c timeout
+ * value bounds the amount of time the ORB blocks waiting to
+ * resolve the service. This is most useful for bootstrapping
+ * remote services, such as the "NameService" or "TradingService",
+ * that are commonly resolved via multicast. By default, the
+ * value is 0, which means "use the @c
+ * TAO_DEFAULT_SERVICE_RESOLUTION_TIMEOUT timeout period".
+ *
+ * @note By using a default value for the @c timeout parameter,
+ * TAO will remains compliant with the CORBA
+ * resolve_initial_references() specification.
+ */
+ CORBA::Object_ptr resolve_initial_references (
+ const char *name,
+ ACE_Time_Value *timeout
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+
+#if !defined(CORBA_E_MICRO)
+ /// Register an object reference with the ORB.
+ void register_initial_reference (const char * id,
+ CORBA::Object_ptr obj
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif
+
+ /// Returns a sequence of ObjectIds that lists which objects have
+ /// references available via the initial references mechanism.
+ CORBA::ORB::ObjectIdList_ptr list_initial_services (
+ ACE_ENV_SINGLE_ARG_DECL_WITH_DEFAULTS);
+
+#if !defined(CORBA_E_MICRO)
+ CORBA::Policy_ptr create_policy (CORBA::PolicyType type,
+ const CORBA::Any& val
+ ACE_ENV_ARG_DECL_WITH_DEFAULTS);
+#endif
+
+ // ----------------------------------------------------------------
+ // = TAO-specific extensions to the CORBA specification.
+ // ----------------------------------------------------------------
+
+#if !defined(CORBA_E_MICRO)
+ /// Create an empty policy, usually to be filled in later by
+ /// demarshaling.
+ CORBA::Policy_ptr _create_policy (CORBA::PolicyType type
+ ACE_ENV_ARG_DECL);
+#endif
+
+ // Reference counting...
+ unsigned long _incr_refcnt (void);
+ unsigned long _decr_refcnt (void);
+
+ /// Set the IOR flag.
+ void _use_omg_ior_format (CORBA::Boolean ior);
+
+ /// Get the IOR flag.
+ CORBA::Boolean _use_omg_ior_format (void);
+
+ /// Get the ORB core.
+ TAO_ORB_Core *orb_core (void) const;
+
+ /**
+ * TAO specific extension to get and set the client ID. The client
+ * id can be set by the application which would be used by the FT
+ * service. As there are no specific interfaces defined in the
+ * spec, we have this proprietary extension.
+ */
+ const ACE_CString &_tao_ft_client_id (void);
+ void _tao_ft_client_id (const char *id);
+
+ /// Factory method that creates an ORB.
+ static CORBA::ORB_ptr _tao_make_ORB (TAO_ORB_Core * orb_core);
+
+ // Useful for template programming.
+ typedef ORB_ptr _ptr_type;
+ typedef ORB_var _var_type;
+ typedef ORB_out _out_type;
+
+ /// Get the Timeout value
+ ACE_Time_Value *get_timeout (void);
+
+ protected:
+
+ // We must be created via the @c CORBA::ORB_init() function.
+ ORB (TAO_ORB_Core *orb_core);
+
+ /// Destructor
+ /**
+ * Protected destructor to enforce proper memory management
+ * through the reference counting mechanism.
+ */
+ ~ORB (void);
+
+ /// Resolve the Policy Manager for this ORB.
+ CORBA::Object_ptr resolve_policy_manager (void);
+
+ /// Resolve the Policy Current for this thread.
+ CORBA::Object_ptr resolve_policy_current (void);
+
+ private:
+
+ /// Resolve the given service based on the service ID.
+ /**
+ * "@c resolve_service" is a legacy name. This method now simply
+ * sets up a default initial reference that will be subsequently
+ * used in resolve_initial_references().
+ */
+ void resolve_service (TAO::MCAST_SERVICEID service_id);
+
+ /// Convert an OMG IOR into an object reference.
+ CORBA::Object_ptr ior_string_to_object (const char* ior
+ ACE_ENV_ARG_DECL);
+
+ /// Convert an URL style IOR into an object reference.
+ CORBA::Object_ptr url_ior_string_to_object (const char* ior
+ ACE_ENV_ARG_DECL);
+
+ /// Check if ORB has shutdown. If it has, throw the appropriate
+ /// exception.
+ void check_shutdown (ACE_ENV_SINGLE_ARG_DECL);
+
+ /// Set the timeout value
+ void set_timeout (ACE_Time_Value * timeout);
+
+ private:
+
+ /// Maintains a reference count of number of instantiations of the
+ /// ORB.
+ ACE_Atomic_Op<TAO_SYNCH_MUTEX, unsigned long> refcount_;
+
+ /// The ORB_Core that created us....
+ TAO_ORB_Core * orb_core_;
+
+ /// Decides whether to use the URL notation or to use IOR notation.
+ CORBA::Boolean use_omg_ior_format_;
+
+ // Prevent copying and assignment.
+ ORB (const ORB &);
+ ORB &operator= (const ORB &);
+
+ /// Timeout value
+ ACE_Time_Value * timeout_;
+
+ };
+} // End namespace CORBA
+
+namespace TAO
+{
+ namespace ORB
+ {
+ /// Initialize the ORB globals correctly, i.e., only when they
+ /// haven't been initialized yet.
+ void init_orb_globals (ACE_ENV_SINGLE_ARG_DECL);
+ }
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+# include "tao/ORB.i"
+#endif /* __ACE_INLINE__ */
+
+#include /**/ "ace/post.h"
+
+#endif /* TAO_ORB_H */