summaryrefslogtreecommitdiff
path: root/ACE/TAO/tao/ORB_Core.inl
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/TAO/tao/ORB_Core.inl')
-rw-r--r--ACE/TAO/tao/ORB_Core.inl677
1 files changed, 677 insertions, 0 deletions
diff --git a/ACE/TAO/tao/ORB_Core.inl b/ACE/TAO/tao/ORB_Core.inl
new file mode 100644
index 00000000000..491012809cd
--- /dev/null
+++ b/ACE/TAO/tao/ORB_Core.inl
@@ -0,0 +1,677 @@
+// -*- C++ -*-
+//
+// $Id$
+
+#include "tao/ORB_Core_TSS_Resources.h"
+#include "tao/ORB_Table.h"
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+ACE_INLINE ACE_Service_Gestalt*
+TAO_ORB_Core::configuration (void) const
+{
+ return this->config_.get ();
+}
+
+ACE_INLINE unsigned long
+TAO_ORB_Core::_incr_refcnt (void)
+{
+ return this->refcount_++;
+}
+
+ACE_INLINE unsigned long
+TAO_ORB_Core::_refcnt (void) const
+{
+ return this->refcount_.value ();
+}
+
+ACE_INLINE unsigned long
+TAO_ORB_Core::_decr_refcnt (void)
+{
+ unsigned long const count = --this->refcount_;
+ if (count != 0)
+ return count;
+
+ this->fini ();
+ return 0;
+}
+
+ACE_INLINE ACE_Lock *
+TAO_ORB_Core::locking_strategy (void)
+{
+ if (this->resource_factory ()->use_locked_data_blocks ())
+ return &this->data_block_lock_;
+
+ return 0;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::bidir_giop_policy (void)
+{
+ return this->bidir_giop_policy_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::bidir_giop_policy (CORBA::Boolean val)
+{
+ this->bidir_giop_policy_ = val;
+}
+
+ACE_INLINE TAO_Object_Ref_Table &
+TAO_ORB_Core::object_ref_table (void)
+{
+ return this->object_ref_table_;
+}
+
+ACE_INLINE TAO::ObjectKey_Table &
+TAO_ORB_Core::object_key_table (void)
+{
+ return this->object_key_table_;
+}
+
+ACE_INLINE TAO_Flushing_Strategy *
+TAO_ORB_Core::flushing_strategy (void)
+{
+ return this->flushing_strategy_;
+}
+
+ACE_INLINE TAO_Protocols_Hooks *
+TAO_ORB_Core::get_protocols_hooks (void)
+{
+ return this->protocols_hooks_;
+}
+
+ACE_INLINE TAO_Network_Priority_Protocols_Hooks *
+TAO_ORB_Core::get_network_priority_protocols_hooks (void)
+{
+ return this->network_priority_protocols_hooks_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::service_profile_selection (const TAO_MProfile &mprofile,
+ TAO_Profile *&profile)
+{
+ CORBA::Boolean retval = false;
+ // @@ If different services have the same feature we may want to
+ // prioritise them here. We need to decide here whose selection of
+ // profile is more important.
+ if (this->ft_service_.service_callback ())
+ {
+ retval =
+ this->ft_service_.service_callback ()->select_profile (mprofile,
+ profile);
+ }
+ return retval;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::object_is_nil (CORBA::Object_ptr obj)
+{
+ CORBA::Boolean retval = false;
+ if (this->ft_service_.service_callback ())
+ {
+ retval = this->ft_service_.service_callback ()->object_is_nil (obj);
+ }
+ return retval;
+}
+
+
+ACE_INLINE TAO_Service_Callbacks::Profile_Equivalence
+TAO_ORB_Core::is_profile_equivalent (const TAO_Profile *this_p,
+ const TAO_Profile *that_p)
+{
+ TAO_Service_Callbacks::Profile_Equivalence retval
+ = TAO_Service_Callbacks::DONT_KNOW;
+
+ if (this->ft_service_.service_callback ())
+ {
+ retval =
+ this->ft_service_.service_callback ()->is_profile_equivalent (this_p,
+ that_p);
+ }
+
+ return retval;
+}
+
+ACE_INLINE CORBA::ULong
+TAO_ORB_Core::hash_service (TAO_Profile *p, CORBA::ULong m)
+{
+ if (this->ft_service_.service_callback ())
+ {
+ return this->ft_service_.service_callback ()->hash_ft (p, m);
+ }
+
+ return 0;
+}
+
+ACE_INLINE TAO_Fault_Tolerance_Service &
+TAO_ORB_Core::fault_tolerance_service (void)
+{
+ return this->ft_service_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::ft_send_extended_sc (void)
+{
+ return this->ft_send_extended_sc_;
+}
+
+ACE_INLINE ACE_Thread_Manager *
+TAO_ORB_Core::thr_mgr (void)
+{
+ return &this->tm_;
+}
+
+ACE_INLINE CORBA::ORB_ptr
+TAO_ORB_Core::orb (void)
+{
+ return this->orb_;
+}
+
+ACE_INLINE TAO_Adapter_Registry &
+TAO_ORB_Core::adapter_registry (void)
+{
+ return this->adapter_registry_;
+}
+
+ACE_INLINE TAO_Request_Dispatcher *
+TAO_ORB_Core::request_dispatcher (void)
+{
+ return this->request_dispatcher_;
+}
+
+ACE_INLINE TAO_ORB_Core::InitRefMap *
+TAO_ORB_Core::init_ref_map (void)
+{
+ return &this->init_ref_map_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::set_default (const char * orb_id)
+{
+ TAO::ORB_Table * const table = TAO::ORB_Table::instance ();
+ table->set_default (orb_id);
+}
+
+ACE_INLINE void
+TAO_ORB_Core::not_default (const char * orb_id)
+{
+ TAO::ORB_Table * const table = TAO::ORB_Table::instance ();
+ table->not_default (orb_id);
+}
+
+ACE_INLINE void
+TAO_ORB_Core::optimize_collocation_objects (CORBA::Boolean opt)
+{
+ this->opt_for_collocation_ = opt;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::optimize_collocation_objects (void) const
+{
+ return this->opt_for_collocation_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::use_global_collocation (CORBA::Boolean opt)
+{
+ this->use_global_collocation_ = opt;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::use_global_collocation (void) const
+{
+ return this->use_global_collocation_;
+}
+
+ACE_INLINE CORBA::ULong
+TAO_ORB_Core::get_collocation_strategy (void) const
+{
+ return this->collocation_strategy_;
+}
+
+ACE_INLINE TAO_ORB_Parameters *
+TAO_ORB_Core::orb_params(void)
+{
+ return &(this->orb_params_);
+}
+
+#define TAO_OC_RETRIEVE(member) \
+((this->member##_ == 0) \
+ ? (this->member##_ = this->resource_factory ()->get_##member ()) \
+ : (this->member##_))
+
+ACE_INLINE TAO_ProtocolFactorySet *
+TAO_ORB_Core::protocol_factories (void)
+{
+ return TAO_OC_RETRIEVE (protocol_factories);
+}
+
+ACE_INLINE TAO_Parser_Registry *
+TAO_ORB_Core::parser_registry (void)
+{
+ return &this->parser_registry_;
+}
+
+#undef TAO_OC_RETRIEVE
+
+#if (TAO_HAS_CORBA_MESSAGING == 1)
+
+ACE_INLINE TAO_Policy_Manager *
+TAO_ORB_Core::policy_manager (void)
+{
+ return this->policy_manager_;
+}
+
+#endif /* TAO_HAS_CORBA_MESSAGING == 1 */
+
+ACE_INLINE TAO_ORB_Core_TSS_Resources*
+TAO_ORB_Core::get_tss_resources (void)
+{
+ return ACE_TSS_GET (&this->tss_resources_,TAO_ORB_Core_TSS_Resources);
+}
+
+ACE_INLINE void *
+TAO_ORB_Core::get_tss_resource (size_t slot_id)
+{
+ TAO_ORB_Core_TSS_Resources *tss_resources =
+ this->get_tss_resources ();
+
+ if (slot_id >= tss_resources->ts_objects_.size ())
+ return 0;
+
+ return tss_resources->ts_objects_[slot_id];
+}
+
+ACE_INLINE int
+TAO_ORB_Core::set_tss_resource (size_t slot_id, void *ts_object)
+{
+ TAO_ORB_Core_TSS_Resources *tss_resources =
+ this->get_tss_resources ();
+
+ // The number of allocated slots is equal to the number of
+ // registered TSS cleanup functions, *not* the size of the array in
+ // the ORB core TSS resources.
+ if (slot_id >= this->tss_cleanup_funcs_.size ())
+ {
+ errno = EINVAL;
+ return -1;
+ }
+
+ // If the TSS array isn't large enough, then increase its size.
+ // We're guaranteed not to exceed the number of allocated slots by
+ // the above check.
+ const size_t old_size = tss_resources->ts_objects_.size ();
+ const size_t new_size = slot_id + 1;
+ if (slot_id >= old_size
+ && tss_resources->ts_objects_.size (new_size) != 0)
+ return -1;
+
+ // Initialize intermediate array elements to zero, since they
+ // haven't been initialized yet. This ensures that garbage is not
+ // returned when accessing any of those elements at a later point in
+ // time.
+ for (size_t i = old_size; i < slot_id; ++i)
+ tss_resources->ts_objects_[i] = 0;
+
+ tss_resources->ts_objects_[slot_id] = ts_object;
+
+ // Make sure the ORB core pointer is set in the ORB core's TSS
+ // resources so that the TSS cleanup functions stored in the ORB
+ // core can be invoked.
+ tss_resources->orb_core_ = this;
+
+ return 0;
+}
+
+ACE_INLINE TAO_Cleanup_Func_Registry *
+TAO_ORB_Core::tss_cleanup_funcs (void)
+{
+ return &(this->tss_cleanup_funcs_);
+}
+
+ACE_INLINE bool
+TAO_ORB_Core::has_shutdown (void) const
+{
+ return this->has_shutdown_;
+}
+
+ACE_INLINE int
+TAO_ORB_Core::thread_per_connection_timeout (ACE_Time_Value &timeout) const
+{
+ timeout = this->thread_per_connection_timeout_;
+ return this->thread_per_connection_use_timeout_;
+}
+
+ACE_INLINE const char *
+TAO_ORB_Core::orbid (void) const
+{
+ return this->orbid_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::implrepo_service (const CORBA::Object_ptr ir)
+{
+ this->implrepo_service_ = ir;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::use_implrepo (void)
+{
+ return use_implrepo_;
+}
+
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::imr_endpoints_in_ior (void)
+{
+ return imr_endpoints_in_ior_;
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_typecodefactory (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->typecode_factory_))
+ {
+ this->resolve_typecodefactory_i ();
+ }
+ return CORBA::Object::_duplicate (this->typecode_factory_);
+}
+
+#if TAO_HAS_INTERCEPTORS == 1
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_picurrent (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->pi_current_))
+ {
+ this->resolve_picurrent_i ();
+ }
+ return CORBA::Object::_duplicate (this->pi_current_);
+}
+
+#endif /* TAO_HAS_INTERCEPTORS == 1 */
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_codecfactory (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->codec_factory_))
+ {
+ this->resolve_codecfactory_i ();
+ }
+ return CORBA::Object::_duplicate (this->codec_factory_);
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_compression_manager (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->compression_manager_))
+ {
+ this->resolve_compression_manager_i ();
+ }
+ return CORBA::Object::_duplicate (this->compression_manager_);
+}
+
+ACE_INLINE const char *
+TAO_ORB_Core::server_id (void) const
+{
+ return this->server_id_.c_str();
+}
+
+ACE_INLINE TAO_Codeset_Manager *
+TAO_ORB_Core::codeset_manager()
+{
+ if (this->orb_params()->negotiate_codesets() == 0)
+ return 0;
+ if (this->codeset_manager_ == 0)
+ {
+ // This causes a factory to be loaded which will call
+ // the codeset_manager setter in this thread.
+ this->codeset_manager_ =
+ this->resource_factory()->codeset_manager();
+ if (this->codeset_manager_ == 0)
+ this->orb_params()->negotiate_codesets(false);
+ }
+ return this->codeset_manager_;
+}
+
+ACE_INLINE TAO_ZIOP_Adapter *
+TAO_ORB_Core::ziop_adapter () const
+{
+ return this->ziop_adapter_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::ziop_adapter (TAO_ZIOP_Adapter *adapter)
+{
+ this->ziop_adapter_ = adapter;
+}
+
+ACE_INLINE TAO::ORBInitializer_Registry_Adapter *
+TAO_ORB_Core::orbinitializer_registry ()
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ 0);
+ if (orbinitializer_registry_ == 0)
+ {
+ return this->orbinitializer_registry_i ();
+ }
+ return this->orbinitializer_registry_;
+}
+
+ACE_INLINE TAO_Service_Context_Registry &
+TAO_ORB_Core::service_context_registry (void)
+{
+ return this->service_context_registry_;
+}
+
+ACE_INLINE TAO::PolicyFactory_Registry_Adapter *
+TAO_ORB_Core::policy_factory_registry ()
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ 0);
+ if (policy_factory_registry_ == 0)
+ {
+ return this->policy_factory_registry_i ();
+ }
+ return this->policy_factory_registry_;
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_dynanyfactory (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->dynany_factory_))
+ {
+ this->resolve_dynanyfactory_i ();
+ }
+ return CORBA::Object::_duplicate (this->dynany_factory_);
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_ior_manipulation (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->ior_manip_factory_))
+ {
+ this->resolve_iormanipulation_i ();
+ }
+ return CORBA::Object::_duplicate (this->ior_manip_factory_);
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_ior_table (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->ior_table_))
+ {
+ this->resolve_ior_table_i ();
+ }
+ return CORBA::Object::_duplicate (this->ior_table_);
+}
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_monitor (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->monitor_))
+ {
+ this->resolve_monitor_i ();
+ }
+ return CORBA::Object::_duplicate (this->monitor_);
+}
+
+// ****************************************************************
+
+#if (TAO_HAS_CORBA_MESSAGING == 1)
+
+ACE_INLINE TAO_Policy_Current &
+TAO_ORB_Core::policy_current (void)
+{
+ return *this->policy_current_;
+}
+
+#endif /* TAO_HAS_CORBA_MESSAGING == 1 */
+
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_poa_current (void)
+{
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->poa_current_.in ()))
+ {
+ this->resolve_poa_current_i ();
+ }
+ return CORBA::Object::_duplicate (this->poa_current_.in ());
+}
+
+#if (TAO_HAS_CORBA_MESSAGING == 1)
+
+ACE_INLINE TAO_Policy_Set *
+TAO_ORB_Core::get_default_policies (void)
+{
+ return this->default_policies_;
+}
+
+#endif /* TAO_HAS_CORBA_MESSAGING == 1 */
+
+#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::resolve_rt_orb (void)
+{
+ if (CORBA::is_nil (this->rt_orb_.in ()))
+ {
+ ACE_GUARD_RETURN (TAO_SYNCH_MUTEX, mon, this->lock_,
+ CORBA::Object::_nil ());
+ if (CORBA::is_nil (this->rt_orb_.in ()))
+ {
+ // Save a reference to the priority mapping manager.
+ this->rt_orb_ =
+ this->object_ref_table ().resolve_initial_reference (
+ TAO_OBJID_RTORB);
+ }
+ }
+
+ return CORBA::Object::_duplicate (this->rt_orb_.in ());
+}
+#endif
+
+#if (TAO_HAS_INTERCEPTORS == 1)
+ACE_INLINE CORBA::Object_ptr
+TAO_ORB_Core::pi_current (void)
+{
+ // A pointer/reference to PICurrent is cached in the ORB Core since
+ // it is accessed in the critical path (i.e. the request invocation
+ // path). Caching it prevents additional overhead to due object
+ // resolution from occurring.
+ return this->pi_current_;
+}
+
+ACE_INLINE void
+TAO_ORB_Core::pi_current (CORBA::Object_ptr current)
+{
+ // Not duplicated since the ORB Core's "object_ref_table" already
+ // contains a duplicate of the PICurrent object.
+ this->pi_current_ = current;
+}
+
+ACE_INLINE TAO::ClientRequestInterceptor_Adapter *
+TAO_ORB_Core::clientrequestinterceptor_adapter (void)
+{
+ return this->client_request_interceptor_adapter_;
+}
+
+ACE_INLINE TAO::ServerRequestInterceptor_Adapter *
+TAO_ORB_Core::serverrequestinterceptor_adapter (void)
+{
+ return this->server_request_interceptor_adapter_;
+}
+
+#endif /* TAO_HAS_INTERCEPTORS */
+
+/// Verify condition for permanent forward is given,
+/// both parameters must provide group attributes.
+ACE_INLINE CORBA::Boolean
+TAO_ORB_Core::is_permanent_forward_condition
+(const CORBA::Object_ptr obj,
+ const TAO_Service_Context &service_context)
+{
+ const TAO_Service_Callbacks *service_callback =
+ this->fault_tolerance_service ().service_callback ();
+
+ // Since forward location is allowed to be nil then check for it.
+ CORBA::Boolean const permanent_forward_condition =
+ service_callback && obj &&
+ service_callback->is_permanent_forward_condition (obj,
+ service_context);
+
+ return permanent_forward_condition;
+}
+
+ACE_INLINE
+void
+TAO_ORB_Core::set_sync_scope_hook (Sync_Scope_Hook hook)
+{
+ this->sync_scope_hook_ = hook;
+}
+
+ACE_INLINE
+void
+TAO_ORB_Core::set_timeout_hook (Timeout_Hook hook)
+{
+ // Saving the hook pointer so that we can use it later when needed.
+ this->timeout_hook_ = hook;
+}
+
+#if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1)
+
+ACE_INLINE
+void
+TAO_ORB_Core::set_eager_transport_queueing_strategy (
+ TAO::Transport_Queueing_Strategy* strategy)
+{
+ this->eager_transport_queueing_strategy_ = strategy;
+}
+
+ACE_INLINE
+void
+TAO_ORB_Core::set_delayed_transport_queueing_strategy (
+ TAO::Transport_Queueing_Strategy* strategy)
+{
+ this->delayed_transport_queueing_strategy_ = strategy;
+}
+
+#endif
+
+TAO_END_VERSIONED_NAMESPACE_DECL