summaryrefslogtreecommitdiff
path: root/TAO/tao/RTPortableServer/RT_Policy_Validator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/RTPortableServer/RT_Policy_Validator.cpp')
-rw-r--r--TAO/tao/RTPortableServer/RT_Policy_Validator.cpp291
1 files changed, 250 insertions, 41 deletions
diff --git a/TAO/tao/RTPortableServer/RT_Policy_Validator.cpp b/TAO/tao/RTPortableServer/RT_Policy_Validator.cpp
index f962b9727bf..35093e5e2fa 100644
--- a/TAO/tao/RTPortableServer/RT_Policy_Validator.cpp
+++ b/TAO/tao/RTPortableServer/RT_Policy_Validator.cpp
@@ -4,12 +4,18 @@
#include "tao/PortableServer/PortableServerC.h"
#include "tao/ORB_Core.h"
#include "tao/RTCORBA/RT_Policy_i.h"
+#include "tao/RTCORBA/Thread_Pool.h"
+#include "tao/RTCORBA/RT_ORB.h"
+#include "tao/Thread_Lane_Resources_Manager.h"
+#include "tao/Thread_Lane_Resources.h"
#include "tao/Acceptor_Registry.h"
ACE_RCSID(tao, POA, "$Id$")
-TAO_POA_RT_Policy_Validator::TAO_POA_RT_Policy_Validator (TAO_ORB_Core *orb_core)
- : orb_core_ (orb_core)
+TAO_POA_RT_Policy_Validator::TAO_POA_RT_Policy_Validator (TAO_ORB_Core &orb_core)
+ : TAO_POA_Policy_Validator (orb_core),
+ acceptor_registry_ (0),
+ thread_pool_ (0)
{
// No-Op.
}
@@ -19,11 +25,21 @@ TAO_POA_RT_Policy_Validator::~TAO_POA_RT_Policy_Validator (void)
// No-Op.
}
+TAO_Acceptor_Registry *
+TAO_POA_RT_Policy_Validator::acceptor_registry (void)
+{
+ if (this->acceptor_registry_ == 0)
+ this->acceptor_registry_ =
+ TAO_POA_RT_Policy_Validator::extract_acceptor_registry (this->orb_core_,
+ this->thread_pool_);
+ return this->acceptor_registry_;
+}
+
void
TAO_POA_RT_Policy_Validator::validate_impl (TAO_Policy_Set &policies,
CORBA::Environment &ACE_TRY_ENV)
{
- this->orb_core_->open (ACE_TRY_ENV);
+ this->validate_thread_pool (policies, ACE_TRY_ENV);
ACE_CHECK;
this->validate_server_protocol (policies, ACE_TRY_ENV);
@@ -31,13 +47,13 @@ TAO_POA_RT_Policy_Validator::validate_impl (TAO_Policy_Set &policies,
this->validate_priorities (policies, ACE_TRY_ENV);
ACE_CHECK;
-
}
CORBA::Boolean
TAO_POA_RT_Policy_Validator::legal_policy_impl (CORBA::PolicyType type)
{
return (type == RTCORBA::PRIORITY_MODEL_POLICY_TYPE ||
+ type == RTCORBA::THREADPOOL_POLICY_TYPE ||
type == RTCORBA::CLIENT_PROTOCOL_POLICY_TYPE ||
type == RTCORBA::SERVER_PROTOCOL_POLICY_TYPE ||
type == RTCORBA::PRIORITY_BANDED_CONNECTION_POLICY_TYPE);
@@ -65,24 +81,33 @@ TAO_POA_RT_Policy_Validator::validate_server_protocol (TAO_Policy_Set &policies,
RTCORBA::ProtocolList &protocols =
server_protocol->protocols_rep ();
- TAO_Acceptor_Registry *ar = this->orb_core_->acceptor_registry ();
+ TAO_Acceptor_Registry *acceptor_registry =
+ this->acceptor_registry ();
for (CORBA::ULong j = 0; j < protocols.length (); ++j)
{
+ int found = 0;
CORBA::ULong protocol_type = protocols[j].protocol_type;
- for (TAO_AcceptorSetIterator a = ar->begin (); a != ar->end (); ++a)
+ for (TAO_AcceptorSetIterator a = acceptor_registry->begin ();
+ a != acceptor_registry->end ();
+ ++a)
{
if ((*a)->tag () == protocol_type)
- return;
+ {
+ found = 1;
+ break;
+ }
}
+
+ if (!found)
+ ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
- ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
void
TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies,
- CORBA::Environment &ACE_TRY_ENV)
+ CORBA::Environment &ACE_TRY_ENV)
{
// Initialize to the default priority/priority model.
RTCORBA::Priority priority = TAO_INVALID_PRIORITY;
@@ -105,8 +130,8 @@ TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies,
ACE_CHECK;
// Check that the priority is in bounds.
- if (priority < RTCORBA::minPriority
- || priority > RTCORBA::maxPriority)
+ if (priority < RTCORBA::minPriority ||
+ priority > RTCORBA::maxPriority)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
@@ -123,30 +148,44 @@ TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies,
priority_bands.in ());
// If priority banded connections are set, make sure that:
- // 0. There is at least one band.
- // 1. Priority model is also set.
- // 2. If priority model is SERVER_DECLARED, server_priority must
- // match one of the bands.
- // 3. For each band, there must be at least one endpoint that can
- // service it, i.e., whose priority falls into the band's range.
+ // 1. There is at least one band.
+ // 2a. low is not < RTCORBA::minPriority
+ // 2b. low <= high
+ // 2c. high is not > RTCORBA::maxPriority
+ // 3. If priority model is SERVER_DECLARED, server_priority must
+ // match one of the bands.
+ // 4. If this POA has a thread pool with lanes, then for each band,
+ // there must be at least one thread lane that can service it,
+ // i.e., whose priority falls into the band's range.
if (bands_policy != 0)
{
RTCORBA::PriorityBands &bands =
bands_policy->priority_bands_rep ();
- // Checks 0 and 1.
- if (bands.length () == 0
- || priority == TAO_INVALID_PRIORITY)
+ // Checks 1.
+ if (bands.length () == 0)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
- // Check 2.
+ // Checks 2.
+ for (CORBA::ULong i = 0; i < bands.length (); ++i)
+ {
+ // 2a. low is not < RTCORBA::minPriority
+ // 2b. low is not > high
+ // 2c. high is not > RTCORBA::maxPriority
+ if (bands[i].low < RTCORBA::minPriority ||
+ bands[i].low > bands[i].high ||
+ bands[i].high > RTCORBA::maxPriority)
+ ACE_THROW (PortableServer::POA::InvalidPolicy ());
+ }
+
+ // Check 3.
if (rt_priority_model == RTCORBA::SERVER_DECLARED)
{
int match = 0;
for (CORBA::ULong i = 0; i < bands.length (); ++i)
{
- if (priority <= bands[i].high
- && priority >= bands[i].low)
+ if (priority <= bands[i].high &&
+ priority >= bands[i].low)
{
match = 1;
break;
@@ -157,21 +196,38 @@ TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies,
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
- // Check 3.
- TAO_Acceptor_Registry *ar = this->orb_core_->acceptor_registry ();
- for (CORBA::ULong i = 0; i < bands.length (); ++i)
+ //
+ // Check 4.
+ //
+
+ // If this POA is using the default thread pool (which doesn't
+ // have lanes) or a thread pool without lanes, we are done with
+ // the checks.
+ if (this->thread_pool_ == 0 ||
+ !this->thread_pool_->with_lanes ())
+ return;
+
+ // If this POA is using a thread pool with lanes, make sure we
+ // have at least one thread lane that corresponds to these
+ // each band.
+ TAO_Thread_Lane **lanes =
+ this->thread_pool_->lanes ();
+
+ for (CORBA::ULong band = 0;
+ band < bands.length ();
+ ++band)
{
int match = 0;
- for (TAO_AcceptorSetIterator a = ar->begin ();
- a != ar->end ();
- ++a)
+ for (CORBA::ULong lane = 0;
+ lane != this->thread_pool_->number_of_lanes () && !match;
+ ++lane)
{
- if ((*a)->priority () <= bands[i].high
- && (*a)->priority () >= bands[i].low)
- {
- match = 1;
- break;
- }
+ CORBA::Short lane_priority =
+ lanes[lane]->lane_priority ();
+
+ if (lane_priority <= bands[band].high &&
+ lane_priority >= bands[band].low)
+ match = 1;
}
if (!match)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
@@ -187,14 +243,167 @@ TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies,
// priority.
if (rt_priority_model == RTCORBA::SERVER_DECLARED)
{
- TAO_Acceptor_Registry *ar = this->orb_core_->acceptor_registry ();
-
- for (TAO_AcceptorSetIterator a = ar->begin (); a != ar->end (); ++a)
+ // If this POA is using the default thread pool (which doesn't
+ // have lanes) or a thread pool without lanes, we are done with
+ // the checks.
+ if (this->thread_pool_ == 0 ||
+ !this->thread_pool_->with_lanes ())
+ return;
+
+ // If this POA is using a thread pool with lanes, make sure we
+ // have at least one thread lane that corresponds to these
+ // each band.
+ TAO_Thread_Lane **lanes =
+ this->thread_pool_->lanes ();
+
+ int match = 0;
+ for (CORBA::ULong lane = 0;
+ lane != this->thread_pool_->number_of_lanes () && !match;
+ ++lane)
{
- if ((*a)->priority () == priority)
- return;
+ CORBA::Short lane_priority =
+ lanes[lane]->lane_priority ();
+
+ if (lane_priority <= priority &&
+ lane_priority >= priority)
+ match = 1;
}
+ if (!match)
+ ACE_THROW (PortableServer::POA::InvalidPolicy ());
- ACE_THROW (CORBA::BAD_PARAM ());
+ // Done with checks.
+ return;
}
+
+}
+
+void
+TAO_POA_RT_Policy_Validator::validate_thread_pool (TAO_Policy_Set &policies,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ this->thread_pool_ =
+ TAO_POA_RT_Policy_Validator::extract_thread_pool (this->orb_core_,
+ policies,
+ ACE_TRY_ENV);
+ ACE_CHECK;
+}
+
+void
+TAO_POA_RT_Policy_Validator::merge_policies_impl (TAO_Policy_Set &policies,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ CORBA::Policy_var policy =
+ this->orb_core_.get_cached_policy (TAO_CACHED_POLICY_PRIORITY_MODEL);
+ if (!CORBA::is_nil (policy.in ()))
+ {
+ policies.set_policy (policy.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+
+ CORBA::Policy_var protocol =
+ this->orb_core_.get_cached_policy (TAO_CACHED_POLICY_RT_SERVER_PROTOCOL);
+ if (!CORBA::is_nil (protocol.in ()))
+ {
+ policies.set_policy (protocol.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+
+ CORBA::Policy_var thread_pool =
+ this->orb_core_.get_cached_policy (TAO_CACHED_POLICY_THREADPOOL);
+ if (!CORBA::is_nil (thread_pool.in ()))
+ {
+ policies.set_policy (thread_pool.in (), ACE_TRY_ENV);
+ ACE_CHECK;
+ }
+}
+
+/* static */
+TAO_Thread_Pool *
+TAO_POA_RT_Policy_Validator::extract_thread_pool (TAO_ORB_Core &orb_core,
+ TAO_Policy_Set &policies,
+ CORBA::Environment &ACE_TRY_ENV)
+{
+ CORBA::Policy_var policy =
+ policies.get_cached_policy (TAO_CACHED_POLICY_THREADPOOL);
+
+ RTCORBA::ThreadpoolPolicy_var thread_pool_policy =
+ RTCORBA::ThreadpoolPolicy::_narrow (policy.in (),
+ ACE_TRY_ENV);
+ ACE_CHECK_RETURN (0);
+
+ if (CORBA::is_nil (thread_pool_policy.in ()))
+ return 0;
+
+ RTCORBA::ThreadpoolId thread_pool_id =
+ thread_pool_policy->threadpool (ACE_TRY_ENV);
+ ACE_CHECK_RETURN (0);
+
+ // Get the RTORB.
+ CORBA::Object_var object =
+ orb_core.resolve_rt_orb (ACE_TRY_ENV);
+ ACE_CHECK_RETURN (0);
+
+ RTCORBA::RTORB_var rt_orb =
+ RTCORBA::RTORB::_narrow (object,
+ ACE_TRY_ENV);
+ ACE_CHECK_RETURN (0);
+
+ TAO_RT_ORB *tao_rt_orb =
+ ACE_dynamic_cast (TAO_RT_ORB *,
+ rt_orb.in ());
+
+ TAO_Thread_Pool_Manager &tp_manager =
+ tao_rt_orb->tp_manager ();
+
+ TAO_Thread_Pool_Manager::THREAD_POOLS &thread_pools =
+ tp_manager.thread_pools ();
+
+ // Check that the thread pool id is valid.
+ TAO_Thread_Pool *thread_pool = 0;
+ int result =
+ thread_pools.find (thread_pool_id,
+ thread_pool);
+
+ if (result != 0)
+ ACE_THROW_RETURN (PortableServer::POA::InvalidPolicy (),
+ 0);
+
+ return thread_pool;
+}
+
+/* static */
+TAO_Acceptor_Registry *
+TAO_POA_RT_Policy_Validator::extract_acceptor_registry (TAO_ORB_Core &orb_core,
+ TAO_Thread_Pool *thread_pool)
+{
+ TAO_Acceptor_Registry *acceptor_registry = 0;
+
+ // If <thread_pool_> != 0, it means that we have a RT thread pool.
+ if (thread_pool)
+ {
+ TAO_Thread_Lane **lanes =
+ thread_pool->lanes ();
+
+ // All the lanes have similar acceptor registries. Therefore,
+ // looking at the first lane should suffice.
+ TAO_Thread_Lane_Resources &resources =
+ lanes[0]->resources ();
+
+ acceptor_registry =
+ &resources.acceptor_registry ();
+ }
+ else
+ // We are dealing with the default thread pool.
+ {
+ TAO_Thread_Lane_Resources_Manager &thread_lane_resources_manager =
+ orb_core.thread_lane_resources_manager ();
+
+ TAO_Thread_Lane_Resources &resources =
+ thread_lane_resources_manager.default_lane_resources ();
+
+ acceptor_registry =
+ &resources.acceptor_registry ();
+ }
+
+ return acceptor_registry;
}