diff options
Diffstat (limited to 'TAO/tao')
-rw-r--r-- | TAO/tao/Invocation.cpp | 28 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.cpp | 34 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.h | 44 | ||||
-rw-r--r-- | TAO/tao/ORB_Core.i | 70 | ||||
-rw-r--r-- | TAO/tao/Object.cpp | 13 | ||||
-rw-r--r-- | TAO/tao/Object.i | 6 | ||||
-rw-r--r-- | TAO/tao/Service_Callbacks.cpp | 38 | ||||
-rw-r--r-- | TAO/tao/Service_Callbacks.h | 70 | ||||
-rw-r--r-- | TAO/tao/Service_Callbacks.i | 1 | ||||
-rw-r--r-- | TAO/tao/Services_Activate.cpp | 21 | ||||
-rw-r--r-- | TAO/tao/Services_Activate.h | 61 | ||||
-rw-r--r-- | TAO/tao/Stub.cpp | 8 | ||||
-rw-r--r-- | TAO/tao/Stub.h | 8 | ||||
-rw-r--r-- | TAO/tao/Stub.i | 34 | ||||
-rw-r--r-- | TAO/tao/Tagged_Components.cpp | 2 | ||||
-rw-r--r-- | TAO/tao/Tagged_Components.h | 3 | ||||
-rw-r--r-- | TAO/tao/Tagged_Components.i | 4 |
17 files changed, 433 insertions, 12 deletions
diff --git a/TAO/tao/Invocation.cpp b/TAO/tao/Invocation.cpp index c447454c842..d24550b0ac8 100644 --- a/TAO/tao/Invocation.cpp +++ b/TAO/tao/Invocation.cpp @@ -354,9 +354,31 @@ TAO_GIOP_Invocation::start (CORBA::Environment &ACE_TRY_ENV) // profiles to try. for (;;) { - // Select the profile for this invocation. - this->select_endpoint_based_on_policy (ACE_TRY_ENV); - ACE_CHECK; + // Check whether any of the services that are loaded wants to + // select the profile. + // @@ IMHO, the selection of profiles has become *too* + // complicated. I am going to increase the complication by + // adding another call. This becomes important for FT service + // whose profile selection are done elsewhere. At this point I + // am just going to call the right call that would select the + // profile. IMHO, the RT guys should do this too ie. move the + // profile selection elsewhere. It is becoming hard to read the + // code that does profile selection. + if (this->stub_->service_profile_selection ()) + { + // @@ This is something a bit crazy again. We are setting + // this at too many places.. Result, confusion. + this->profile_ = this->stub_->profile_in_use (); + this->endpoint_ = this->profile_->endpoint (); + } + else + { + // Select the profile for this invocation if the loaded + // services have nothing to say on profile selection. + this->select_endpoint_based_on_policy (ACE_TRY_ENV); + ACE_CHECK; + } + // Get the transport object. if (this->transport_ != 0) diff --git a/TAO/tao/ORB_Core.cpp b/TAO/tao/ORB_Core.cpp index c0406bb8cb9..3ae0c8b7daf 100644 --- a/TAO/tao/ORB_Core.cpp +++ b/TAO/tao/ORB_Core.cpp @@ -35,6 +35,8 @@ #include "ace/Env_Value_T.h" #include "ace/Dynamic_Service.h" #include "ace/Arg_Shifter.h" +#include "tao/Services_Activate.h" + #if defined(ACE_MVS) #include "ace/Codeset_IBM1047.h" @@ -44,6 +46,7 @@ # include "tao/ORB_Core.i" #endif /* ! __ACE_INLINE__ */ + ACE_RCSID(tao, ORB_Core, "$Id$") // **************************************************************** @@ -82,6 +85,7 @@ TAO_ORB_Core::TAO_ORB_Core (const char *orbid) server_factory_from_service_config_ (0), // @@ This is not needed since the default server factory, fredk // is statically added to the service configurator. + ft_service_callbacks_ (0), opt_for_collocation_ (1), use_global_collocation_ (1), collocation_strategy_ (THRU_POA), @@ -1234,6 +1238,8 @@ TAO_ORB_Core::init (int &argc, char *argv[], CORBA::Environment &ACE_TRY_ENV) this, this->orb_params ()->preconnects ()); + + // Set ORB-level policy defaults. if (this->set_default_policies () != 0) ACE_THROW_RETURN (CORBA::INITIALIZE ( @@ -1243,6 +1249,9 @@ TAO_ORB_Core::init (int &argc, char *argv[], CORBA::Environment &ACE_TRY_ENV) CORBA::COMPLETED_NO), -1); + // As a last step perform initializations of the service callbacks + this->services_callbacks_init (); + // The ORB has been initialized, meaning that the ORB is no longer // in the shutdown state. this->has_shutdown_ = 0; @@ -1373,6 +1382,29 @@ TAO_ORB_Core::resource_factory (void) return this->resource_factory_; } +void +TAO_ORB_Core::services_callbacks_init (void) +{ + // We (should) know what are the services that would need + // callbacks. So, what we do is go through the Service Configurator + // list for looking at the services that we want to load. + + // @@ At this point of time, we have hard coded the names of services + // @@ callbacks that we are looking at. But this needs to change + // @@ once we have some more understanding of the other services + // @@ that have specs similar to FT. + if (this->ft_service_callbacks_ == 0) + { + TAO_Services_Activate *service = + ACE_Dynamic_Service <TAO_Services_Activate>::instance ("TAO_FT_Service_Activate"); + + // Activate the callback + if (service) + this->ft_service_callbacks_ = service->activate_services (this); + } + // @@ Other service callbacks can be added here +} + TAO_Client_Strategy_Factory * TAO_ORB_Core::client_factory (void) { @@ -2477,6 +2509,8 @@ TAO_ORB_Core::implrepo_service (void) return CORBA::Object::_duplicate (this->implrepo_service_); } + + #if (TAO_HAS_RELATIVE_ROUNDTRIP_TIMEOUT_POLICY == 1) TAO_RelativeRoundtripTimeoutPolicy * diff --git a/TAO/tao/ORB_Core.h b/TAO/tao/ORB_Core.h index edd3743ebed..de508c7974f 100644 --- a/TAO/tao/ORB_Core.h +++ b/TAO/tao/ORB_Core.h @@ -32,6 +32,7 @@ #include "tao/TAO_Singleton_Manager.h" #include "tao/TAO_Singleton.h" #include "tao/Adapter.h" +#include "tao/Service_Callbacks.h" #include "tao/Parser_Registry.h" #include "ace/Hash_Map_Manager.h" @@ -54,6 +55,8 @@ class TAO_Priority_Mapping; class TAO_Priority_Mapping_Manager; class TAO_RT_ORB; class TAO_RT_Current; +class TAO_MProfile; +class TAO_Profile; #if (TAO_HAS_BUFFERING_CONSTRAINT_POLICY == 1) @@ -517,6 +520,33 @@ public: // isn't included in the set that is passed to the reactor upon ORB // destruction. + // The following methods would represent the hooks in the ORB + // Core. These hooks would be used to call back on the services or + // other features that are dynamically loaded. + + CORBA::Boolean service_profile_selection (TAO_MProfile &mprofile, + TAO_Profile *&profile); + // The loaded service in the ORB_Core would determine if the profile + // selection is going to be made by the services or not. If the + // services do make the selection they would return the selected + // profile through <profile> + + CORBA::Boolean service_profile_reselection (TAO_Stub *stub, + TAO_Profile *&profile); + // The loaded service in the ORB_Core would determine if the profile + // reselection is going to be made by the services or not. If the + // services do make the reselection they would return the selected + // profile through <profile>. The reselction is for the + // multi-profile IORS. + + void reset_service_profile_flags (void); + // Reset the flags in the loaded services. + + CORBA::Boolean object_is_nil (CORBA::Object_ptr object); + // The loaded service would determineif the CORBA::Object_ptr is + // actually nill or not. This would be useful to accomodate new + // enhanced definitions as defined by the service specification. + protected: int init (int &argc, char **argv, CORBA::Environment &ACE_TRY_ENV); @@ -547,6 +577,11 @@ protected: void resolve_iormanipulation_i (CORBA::Environment &ACE_TRY_ENV); // Obtain and cache the IORManipulation factory object reference + + void services_callbacks_init (void); + // Search the Dynamic service list for well known services that has + // callbacks which can be dynamically loaded. + private: void resolve_ior_table_i (CORBA::Environment &ACE_TRY_ENV); @@ -645,6 +680,15 @@ protected: // @@ This is not needed since the server factory factory // is staticaly added to the service configurator. + // Start of service level hooks + // Service level hooks follow. + // NOTE: You shouldn't be deleting these. The service layer that + // allocated them should be deleting them. + + TAO_Service_Callbacks *ft_service_callbacks_; + // ORB level hook to callback on to the service + // End of Service level hooks + CORBA::Boolean opt_for_collocation_; // TRUE if we want to take advantage of collocation optimization in // this ORB. diff --git a/TAO/tao/ORB_Core.i b/TAO/tao/ORB_Core.i index 06631e3c31a..671a54487aa 100644 --- a/TAO/tao/ORB_Core.i +++ b/TAO/tao/ORB_Core.i @@ -57,6 +57,69 @@ TAO_ORB_Core::remove_handle (ACE_HANDLE handle) return 0; } + +ACE_INLINE CORBA::Boolean +TAO_ORB_Core::service_profile_selection (TAO_MProfile &mprofile, + TAO_Profile *&profile) +{ + CORBA::Boolean retval = 0; + // @@ 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_callbacks_ != 0) + { + cout << "ORB_Core.i "<<endl; + retval = + this->ft_service_callbacks_->select_profile (&mprofile, + profile); + } + return retval; +} + +ACE_INLINE CORBA::Boolean +TAO_ORB_Core::service_profile_reselection (TAO_Stub *stub, + TAO_Profile *&profile) +{ + CORBA::Boolean retval = 0; + // @@ 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_callbacks_ != 0) + { + retval = + this->ft_service_callbacks_->reselect_profile (stub, + profile); + } + return retval; +} + +ACE_INLINE void +TAO_ORB_Core::reset_service_profile_flags (void) +{ + // @@ 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_callbacks_ != 0) + { + this->ft_service_callbacks_->reset_profile_flags (); + } + return; +} + + +ACE_INLINE CORBA::Boolean +TAO_ORB_Core::object_is_nil (CORBA::Object_ptr obj) +{ + CORBA::Boolean retval = 0; + if (this->ft_service_callbacks_ != 0) + { + retval = + this->ft_service_callbacks_->object_is_nil (obj); + } + return retval; +} + ACE_INLINE ACE_Thread_Manager * TAO_ORB_Core::thr_mgr (void) { @@ -320,6 +383,13 @@ TAO_ORB_Core::resolve_typecodefactory (CORBA::Environment &ACE_TRY_ENV) return CORBA::Object::_duplicate (this->typecode_factory_); } +/*ACE_INLINE void +TAO_ORB_Core::typecode_factory (const CORBA::Object_ptr tf) +{ + this->typecode_factory_ = tf; +} +*/ + ACE_INLINE CORBA::Object_ptr TAO_ORB_Core::resolve_dynanyfactory (CORBA::Environment &ACE_TRY_ENV) { diff --git a/TAO/tao/Object.cpp b/TAO/tao/Object.cpp index 5d8486d2f9e..280043e5771 100644 --- a/TAO/tao/Object.cpp +++ b/TAO/tao/Object.cpp @@ -266,6 +266,19 @@ CORBA::Object::_use_locate_requests (CORBA::Boolean use_it) #if (TAO_HAS_MINIMUM_CORBA == 0) +CORBA::Boolean +CORBA::is_nil (CORBA::Object_ptr obj) +{ + if (obj == 0) + return 1; + + // To accomodate new definitions + if (obj->_stubobj ()) + return obj->_stubobj ()->orb_core ()->object_is_nil (obj); + + return 0; +} + // NON_EXISTENT ... send a simple call to the object, which will // either elicit a FALSE response or a OBJECT_NOT_EXIST exception. In // the latter case, return FALSE. diff --git a/TAO/tao/Object.i b/TAO/tao/Object.i index 21a1eaade3c..a5e059a33f9 100644 --- a/TAO/tao/Object.i +++ b/TAO/tao/Object.i @@ -41,11 +41,7 @@ CORBA_Object::_duplicate (CORBA_Object_ptr obj) return obj; } -ACE_INLINE CORBA::Boolean -CORBA::is_nil (CORBA::Object_ptr obj) -{ - return obj == 0; -} + // Null pointers represent nil objects. diff --git a/TAO/tao/Service_Callbacks.cpp b/TAO/tao/Service_Callbacks.cpp new file mode 100644 index 00000000000..37c04bc7352 --- /dev/null +++ b/TAO/tao/Service_Callbacks.cpp @@ -0,0 +1,38 @@ +//$Id$ +#include "tao/Service_Callbacks.h" + +#if !defined (__ACE_INLINE__) +# include "tao/Service_Callbacks.i" +#endif /* ! __ACE_INLINE__ */ + +ACE_RCSID(tao, Service_Callbacks, "$Id$") + + +CORBA::Boolean +TAO_Service_Callbacks::select_profile (TAO_MProfile * /*mprofile*/, + TAO_Profile *& /*pfile*/) +{ + return 0; +} + +CORBA::Boolean +TAO_Service_Callbacks::reselect_profile (TAO_Stub * /*stub*/, + TAO_Profile *& /*pfile*/) +{ + return 0; +} + + +CORBA::Boolean +TAO_Service_Callbacks::object_is_nil (CORBA::Object_ptr /* obj */) +{ + // We shouldn't be here at all. But in case if we are here, + // something is wrong. So, we send a true for a is_nil () call + return 1; +} + +void +TAO_Service_Callbacks::reset_profile_flags (void) +{ + return; +} diff --git a/TAO/tao/Service_Callbacks.h b/TAO/tao/Service_Callbacks.h new file mode 100644 index 00000000000..df1222610eb --- /dev/null +++ b/TAO/tao/Service_Callbacks.h @@ -0,0 +1,70 @@ +// $Id$ +// +// ============================================================================ +// +// = LIBRARY +// TAO +// +// = FILENAME +// Service_Callbacks.h +// +// = DESCRIPTION +// This is a generic interface that would be used to override many +// of the default functionalities that the ORB provides. +// +// = AUTHOR +// Bala Natarajan <bala@cs.wustl.edu> +// ============================================================================ +#ifndef TAO_SERVICE_CALLBACK_H +#define TAO_SERVICE_CALLBACK_H +#include "ace/pre.h" + +#include "tao/corbafwd.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +// Need to figure a way to remove this.... +//#include "tao/IOPC.h" + +class TAO_Profile; +class TAO_MProfile; + +class TAO_Export TAO_Service_Callbacks +{ + // = TITLE + // An Abstract Base class for the hooks in the ORB. + // + // = DESCRIPTION + // This class (would) define all the hooks that may be needed by + // the ORB to override some of its default behaviour. The methods + // can be potentially used to call service level specific + // processing that may be required. + +public: + + virtual CORBA::Boolean select_profile (TAO_MProfile *mprofile, + TAO_Profile *&pfile); + // Select the profile from MProfile as the needs of the services + // may be. Return the profile in <pfile> + + virtual CORBA::Boolean reselect_profile (TAO_Stub *stub, + TAO_Profile *&pfile); + // Select the profile from MProfile as the needs of the services + // may be. Return the profile in <pfile> + + virtual void reset_profile_flags (void); + // Reset the profile flags that the services could have + + virtual CORBA::Boolean object_is_nil (CORBA::Object_ptr obj); + // Check whether <obj> is nil or not. +}; + + +#if defined (__ACE_INLINE__) +# include "tao/Service_Callbacks.i" +#endif /* __ACE_INLINE__ */ + +#include "ace/post.h" +#endif /*TAO_SERVICE_CALLBACK_H*/ diff --git a/TAO/tao/Service_Callbacks.i b/TAO/tao/Service_Callbacks.i new file mode 100644 index 00000000000..ca0908bbcf6 --- /dev/null +++ b/TAO/tao/Service_Callbacks.i @@ -0,0 +1 @@ +//$Id$ diff --git a/TAO/tao/Services_Activate.cpp b/TAO/tao/Services_Activate.cpp new file mode 100644 index 00000000000..8ae0516e647 --- /dev/null +++ b/TAO/tao/Services_Activate.cpp @@ -0,0 +1,21 @@ +#include "tao/Services_Activate.h" +#include "ace/Dynamic_Service.h" + + +ACE_RCSID(tao, Services_Activate, "$Id$") + +TAO_Services_Activate::~TAO_Services_Activate (void) +{ + //no-op +} + + +#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) + +template class ACE_Dynamic_Service<TAO_Services_Activate>; + +#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) + +#pragma instantiate ACE_Dynamic_Service<TAO_Services_Activate> + +#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/tao/Services_Activate.h b/TAO/tao/Services_Activate.h new file mode 100644 index 00000000000..da60f55bc4d --- /dev/null +++ b/TAO/tao/Services_Activate.h @@ -0,0 +1,61 @@ +// $Id$ +// +// ============================================================================ +// +// = LIBRARY +// TAO +// +// = FILENAME +// Service_Callbacks.h +// +// = DESCRIPTION +// This is a generic interface that would be used to activate +// the services that are loaded through the svc.conf file +// +// = AUTHOR +// Bala Natarajan <bala@cs.wustl.edu> +// ============================================================================ +#ifndef TAO_SERVICES_ACTIVATE_H +#define TAO_SERVICES_ACTIVATE_H +#include "ace/pre.h" + +#include "tao/corbafwd.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +#include "ace/Service_Object.h" + + +class TAO_ORB_Core; +class TAO_Service_Callbacks; + +class TAO_Export TAO_Services_Activate : public ACE_Service_Object +{ + // = TITLE + // A class to dynamically load callback implementations in to an + // ORB. + // + // = DESCRIPTION + // Many services and components of the ORB whose default behaviour + // needs to be changed can use this class to activate the Callback + // hooks. These hooks can then be called by the ORB at the right + // points. + // @@ TODO + // +public: + virtual ~TAO_Services_Activate (void); + // The destructor + + virtual TAO_Service_Callbacks* activate_services (TAO_ORB_Core *orb) + ACE_THROW_SPEC (()) = 0; + // Create and activate the service callbacks into the orb. + // This method cannot throw any exception, but it can return a nil + // object to indicate an error condition. + +}; + + +#include "ace/post.h" +#endif /*TAO_SERVICES_ACTIVATE_H*/ diff --git a/TAO/tao/Stub.cpp b/TAO/tao/Stub.cpp index 42607b3d55e..ce6ab76a037 100644 --- a/TAO/tao/Stub.cpp +++ b/TAO/tao/Stub.cpp @@ -175,8 +175,15 @@ TAO_Stub::add_forward_profiles (const TAO_MProfile &mprofiles) // Since we have been forwarded, we must set profile_success_ to 0 // since we are starting a new with a new set of profiles! this->profile_success_ = 0; + + // Reset any flags that may be appropriate in the services that + // selects profiles for invocation + this->orb_core_->reset_service_profile_flags (); } + + + // Quick'n'dirty hash of objref data, for partitioning objrefs into // sets. // @@ -572,6 +579,7 @@ TAO_Stub::parse_policies (void) = this->base_profiles_.policy_list (); CORBA::ULong length = policy_list->length (); + // CORBA::ULong index = 0; for (unsigned int i = 0; i < length; ++i) { diff --git a/TAO/tao/Stub.h b/TAO/tao/Stub.h index d203eac116d..69d083ead35 100644 --- a/TAO/tao/Stub.h +++ b/TAO/tao/Stub.h @@ -40,6 +40,7 @@ #include "tao/MProfile.h" #include "tao/ORB.h" +#include "tao/ORB_Core.h" // Forward declarations. @@ -50,7 +51,6 @@ class TAO_Buffering_Constraint_Policy; class TAO_Sync_Strategy; class TAO_GIOP_Invocation; -class TAO_ORB_Core; class TAO_Policy_Manager_Impl; #if (TAO_HAS_RT_CORBA == 1) @@ -380,6 +380,10 @@ public: CORBA::Short addressing_mode (void); // Return the Addressing mode + CORBA::Boolean service_profile_selection (void); + // Make a call on to services to see whether they have some + // preferences on selecting the right profiles. + protected: #if (TAO_HAS_MINIMUM_CORBA == 0) @@ -427,7 +431,7 @@ private: // Helper method used to parse the policies. void exposed_priority_model (CORBA::Policy_ptr policy); - + void exposed_priority_banded_connection (CORBA::Policy_ptr policy); void exposed_client_protocol (CORBA::Policy_ptr policy); diff --git a/TAO/tao/Stub.i b/TAO/tao/Stub.i index 7060817c3c9..7b8cf9b6346 100644 --- a/TAO/tao/Stub.i +++ b/TAO/tao/Stub.i @@ -30,6 +30,7 @@ TAO_Stub::reset_first_locate_request (void) this->first_locate_request_ = 1; } + ACE_INLINE void TAO_Stub::reset_base (void) { @@ -40,6 +41,28 @@ TAO_Stub::reset_base (void) this->set_profile_in_use_i (base_profiles_.get_next ()); } + +ACE_INLINE CORBA::Boolean +TAO_Stub::service_profile_selection (void) +{ + ACE_MT (ACE_GUARD_RETURN (ACE_Lock, + guard, + *this->profile_lock_ptr_, + 0)); + + TAO_Profile *profile = 0; + + this->orb_core_->service_profile_selection (this->base_profiles_, + profile); + if (profile) + { + this->set_profile_in_use_i (profile); + return 1; + } + + return 0; +} + ACE_INLINE void TAO_Stub::forward_back_one (void) { @@ -219,6 +242,17 @@ TAO_Stub::next_profile_retry (void) } else { + // Check whether the loaded services have something to say about + // this condition + TAO_Profile *prof = 0; + this->orb_core_->service_profile_reselection (this, + prof); + + // If the service is loaded and has a profile then try it. + if (prof) + { + return 1; + } this->reset_profiles_i (); return 0; } diff --git a/TAO/tao/Tagged_Components.cpp b/TAO/tao/Tagged_Components.cpp index f83afd65a62..52279af989c 100644 --- a/TAO/tao/Tagged_Components.cpp +++ b/TAO/tao/Tagged_Components.cpp @@ -1,6 +1,8 @@ // $Id$ #include "tao/Tagged_Components.h" +#include "tao/Profile.h" +#include "tao/ORB_Core.h" #if !defined (__ACE_INLINE__) # include "tao/Tagged_Components.i" diff --git a/TAO/tao/Tagged_Components.h b/TAO/tao/Tagged_Components.h index edab507f603..43d54e4dc11 100644 --- a/TAO/tao/Tagged_Components.h +++ b/TAO/tao/Tagged_Components.h @@ -25,6 +25,7 @@ #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "tao/CONV_FRAMEC.h" +class TAO_Profile; class TAO_Export TAO_Tagged_Components { @@ -97,7 +98,7 @@ public: IOP::MultipleComponentProfile &components (void); // Read/Write access to the underlying // MutipleComponentProfile. Added by request from Chris Hafey - // <chris@stentorsoft.com> + // <chris@stentorsoft.com> private: void set_code_sets_i (CONV_FRAME::CodeSetComponent &lhs, diff --git a/TAO/tao/Tagged_Components.i b/TAO/tao/Tagged_Components.i index afc00a69369..70ad180f31c 100644 --- a/TAO/tao/Tagged_Components.i +++ b/TAO/tao/Tagged_Components.i @@ -39,6 +39,7 @@ TAO_Tagged_Components::known_tag (IOP::ComponentId tag) const || tag == IOP::TAG_CODE_SETS); } + ACE_INLINE int TAO_Tagged_Components::unique_tag (IOP::ComponentId tag) const { @@ -58,10 +59,11 @@ TAO_Tagged_Components::unique_tag (IOP::ComponentId tag) const || tag == IOP::TAG_SSL_SEC_TRANS || tag == IOP::TAG_CSI_ECMA_Public_SEC_MECH || tag == IOP::TAG_GENERIC_SEC_MECH - || tag == IOP::TAG_COMPLETE_OBJECT_KEY || tag == IOP::TAG_ENDPOINT_ID_POSITION || tag == IOP::TAG_LOCATION_POLICY + || tag == IOP::TAG_FT_PRIMARY + || tag == IOP::TAG_FT_GROUP || tag == IOP::TAG_DCE_STRING_BINDING || tag == IOP::TAG_DCE_BINDING_NAME || tag == IOP::TAG_DCE_NO_PIPES |