rt_policy_validator.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 510 行 · 第 1/2 页
CPP
510 行
#include "RT_Policy_Validator.h"
#if defined (TAO_HAS_CORBA_MESSAGING) && TAO_HAS_CORBA_MESSAGING != 0
#include "tao/PortableServer/PortableServerC.h"
#include "tao/PortableServer/POA_Cached_Policies.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"
#include "tao/ORB_Core.h"
#include "tao/Policy_Set.h"
#include "tao/Transport_Acceptor.h"
ACE_RCSID (RTPortableServer,
RT_Policy_Validator,
"RT_Policy_Validator.cpp,v 1.10 2003/08/17 07:26:27 ossama Exp")
TAO_POA_RT_Policy_Validator::TAO_POA_RT_Policy_Validator (TAO_ORB_Core &orb_core)
: TAO_Policy_Validator (orb_core),
acceptor_registry_ (0),
thread_pool_ (0)
{
// No-Op.
}
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
ACE_ENV_ARG_DECL)
{
this->validate_thread_pool (policies ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->validate_lifespan (policies ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->validate_server_protocol (policies ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
this->validate_priorities (policies ACE_ENV_ARG_PARAMETER);
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);
}
void
TAO_POA_RT_Policy_Validator::validate_server_protocol (TAO_Policy_Set &policies
ACE_ENV_ARG_DECL)
{
// Make sure we have an endpoint for at least one of the protocols
// specified in the RTCORBA::ServerProtocolPolicy. This ensure we
// will be able to create non-nil object references.
CORBA::Policy_var protocol =
policies.get_cached_policy (TAO_CACHED_POLICY_RT_SERVER_PROTOCOL);
RTCORBA::ServerProtocolPolicy_var server_protocol_policy =
RTCORBA::ServerProtocolPolicy::_narrow (protocol.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_ServerProtocolPolicy *server_protocol =
ACE_dynamic_cast (TAO_ServerProtocolPolicy *,
server_protocol_policy.in ());
RTCORBA::ProtocolList &protocols =
server_protocol->protocols_rep ();
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 = acceptor_registry->begin ();
a != acceptor_registry->end ();
++a)
{
if ((*a)->tag () == protocol_type)
{
found = 1;
break;
}
}
if (!found)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
}
void
TAO_POA_RT_Policy_Validator::validate_priorities (TAO_Policy_Set &policies
ACE_ENV_ARG_DECL)
{
// Initialize to the default priority/priority model.
CORBA::Short priority =
TAO_INVALID_PRIORITY;
TAO_POA_Cached_Policies::PriorityModel rt_priority_model =
TAO_POA_Cached_Policies::NOT_SPECIFIED;
CORBA::Policy_var policy =
policies.get_cached_policy (TAO_CACHED_POLICY_PRIORITY_MODEL);
RTCORBA::PriorityModelPolicy_var priority_model =
RTCORBA::PriorityModelPolicy::_narrow (policy.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
if (!CORBA::is_nil (priority_model.in ()))
{
priority = priority_model->server_priority (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_CHECK;
rt_priority_model =
TAO_POA_Cached_Policies::PriorityModel (
priority_model->priority_model (ACE_ENV_SINGLE_ARG_PARAMETER));
ACE_CHECK;
// Check that the priority is in bounds.
if (priority < RTCORBA::minPriority
// The line below will always be false unless the value of
// RTCORBA::maxPriority, which is now assigned the value of
// 32767, is changed in RTCORBA.pidl.
// || priority > RTCORBA::maxPriority
)
{
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
}
else
// If priority model was not specified, then we better not have a
// thread pool with lanes.
{
if (this->thread_pool_ != 0 &&
this->thread_pool_->with_lanes ())
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
policy =
policies.get_cached_policy (TAO_CACHED_POLICY_RT_PRIORITY_BANDED_CONNECTION);
RTCORBA::PriorityBandedConnectionPolicy_var priority_bands
= RTCORBA::PriorityBandedConnectionPolicy::_narrow (policy.in ()
ACE_ENV_ARG_PARAMETER);
ACE_CHECK;
TAO_PriorityBandedConnectionPolicy *bands_policy =
ACE_dynamic_cast (TAO_PriorityBandedConnectionPolicy *,
priority_bands.in ());
// If priority banded connections are set, make sure that:
// 0. A priority model was specified.
// 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)
{
// Checks 0.
if (rt_priority_model == TAO_POA_Cached_Policies::NOT_SPECIFIED)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
RTCORBA::PriorityBands &bands =
bands_policy->priority_bands_rep ();
// Checks 1.
if (bands.length () == 0)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
// 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
// The line below will always be false unless the value of
// RTCORBA::maxPriority, which is now assigned the value of
// 32767, is changed in RTCORBA.pidl.
// || bands[i].high > RTCORBA::maxPriority
)
{
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
}
// Check 3.
if (rt_priority_model == TAO_POA_Cached_Policies::SERVER_DECLARED)
{
int match = 0;
for (CORBA::ULong i = 0; i < bands.length (); ++i)
{
if (priority <= bands[i].high &&
priority >= bands[i].low)
{
match = 1;
break;
}
}
if (!match)
ACE_THROW (PortableServer::POA::InvalidPolicy ());
}
//
// 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 ();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?