summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TAO/ChangeLogs/ChangeLog-02a33
-rw-r--r--TAO/tao/Invocation.cpp28
-rw-r--r--TAO/tao/ORB_Core.cpp34
-rw-r--r--TAO/tao/ORB_Core.h44
-rw-r--r--TAO/tao/ORB_Core.i70
-rw-r--r--TAO/tao/Object.cpp13
-rw-r--r--TAO/tao/Object.i6
-rw-r--r--TAO/tao/Service_Callbacks.cpp38
-rw-r--r--TAO/tao/Service_Callbacks.h70
-rw-r--r--TAO/tao/Service_Callbacks.i1
-rw-r--r--TAO/tao/Services_Activate.cpp21
-rw-r--r--TAO/tao/Services_Activate.h61
-rw-r--r--TAO/tao/Stub.cpp8
-rw-r--r--TAO/tao/Stub.h8
-rw-r--r--TAO/tao/Stub.i34
-rw-r--r--TAO/tao/Tagged_Components.cpp2
-rw-r--r--TAO/tao/Tagged_Components.h3
-rw-r--r--TAO/tao/Tagged_Components.i4
18 files changed, 466 insertions, 12 deletions
diff --git a/TAO/ChangeLogs/ChangeLog-02a b/TAO/ChangeLogs/ChangeLog-02a
index 1305add5eb9..862eff1b001 100644
--- a/TAO/ChangeLogs/ChangeLog-02a
+++ b/TAO/ChangeLogs/ChangeLog-02a
@@ -1,3 +1,36 @@
+Sun Sep 17 06:37:37 2000 Balachandran Natarajan <bala@cs.wustl.edu>
+
+ * tao/Services_Activate.h:
+ * tao/Services_Activate.cpp: New files added for service
+ activation. If a service like FT service that has lot of ORB
+ components is loaded, a virtual method is used to create a
+ Service_Callback object. The ORB holds that object to call back
+ in to the services at appropriate places to override default
+ behavious in th ORB.
+
+ * tao/Service_Callbacks.cpp:
+ * tao/Service_Callbacks.h:
+ * tao/Service_Callbacks.i: New files added for service
+ callbacks. Now services like FT service can implement methods
+ in these Callback objects to get the right behaviours.
+
+ * tao/Invocation.cpp:
+ * tao/Stub.cpp:
+ * tao/Stub.h:
+ * tao/Stub.i: Added hooks to call the service specific
+ functions. These methods would do the profile selection if the
+ service is loaded in to the ORB_Core.
+
+ * tao/Object.cpp:
+ * tao/Object.i: Added hooks to call services to supplement the
+ behaviour of is_nil () function.
+
+ * tao/ORB_Core.cpp:
+ * tao/ORB_Core.h:
+ * tao/ORB_Core.i: The hooks in the ORB_Core to call the service
+ objects that have been loaded. The hooks are available in the
+ Service_Callback object for calling teh services.
+
Sun Sep 17 06:32:15 2000 Balachandran Natarajan <bala@cs.wustl.edu>
* tao/IOR.pidl:
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