server.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 623 行 · 第 1/2 页
CPP
623 行
CORBA::PolicyList &policies
ACE_ENV_ARG_DECL)
{
ACE_TRY
{
// Create a POA with invalid policies.
PortableServer::POA_var child_poa =
root_poa->create_POA ("Child_POA",
manager,
policies
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// This next line of code should not run because an exception
// should have been raised.
ACE_DEBUG ((LM_DEBUG, "ERROR: no exception caught\n"));
}
ACE_CATCH (PortableServer::POA::InvalidPolicy, ex)
{
// Expected exception.
ACE_DEBUG ((LM_DEBUG,
"InvalidPolicy exception is caught as expected.\n"));
}
ACE_CATCHANY
{
// Unexpected exception.
ACE_DEBUG ((LM_DEBUG, "ERROR: unexpected exception\n"));
ACE_RE_THROW;
}
ACE_ENDTRY;
ACE_CHECK;
}
int
main (int argc, char *argv[])
{
CORBA::ORB_var orb;
ACE_TRY_NEW_ENV
{
// Initialize ORB.
orb =
CORBA::ORB_init (argc,
argv,
""
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Parse arguments.
int result =
parse_args (argc,
argv);
if (result != 0)
return result;
// Make sure we can support multiple priorities that are required
// for this test.
check_supported_priorities (orb.in ());
// Get the RTORB.
CORBA::Object_var object =
orb->resolve_initial_references ("RTORB"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
RTCORBA::RTORB_var rt_orb =
RTCORBA::RTORB::_narrow (object.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the RootPOA.
object =
orb->resolve_initial_references ("RootPOA"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow (object.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Get the POA Manager.
PortableServer::POAManager_var poa_manager =
root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Obtain priority bands to be used in this test from the file
// specified by the user.
RTCORBA::PriorityBands bands;
result = get_priority_bands (bands);
if (result != 0)
ACE_ERROR_RETURN ((LM_ERROR,
"Error reading priority bands from file\n"),
result);
// Create a thread-pool.
CORBA::ULong stacksize = 0;
CORBA::Boolean allow_request_buffering = 0;
CORBA::ULong max_buffered_requests = 0;
CORBA::ULong max_request_buffer_size = 0;
CORBA::Boolean allow_borrowing = 0;
CORBA::ULong static_threads = 1;
CORBA::ULong dynamic_threads = 0;
// The lanes in the pool should match the bands.
RTCORBA::ThreadpoolLanes lanes;
lanes.length (bands.length ());
// For each band, setup up a thread lane.
for (CORBA::ULong i = 0;
i < bands.length ();
++i)
{
lanes[i].static_threads = static_threads;
lanes[i].dynamic_threads = dynamic_threads;
// Lane priority is in the middle of the band priorities.
lanes[i].lane_priority =
(bands[i].low + bands[i].high) / 2;
}
// Create the thread-pool.
RTCORBA::ThreadpoolId threadpool_id =
rt_orb->create_threadpool_with_lanes (stacksize,
lanes,
allow_borrowing,
allow_request_buffering,
max_buffered_requests,
max_request_buffer_size
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Test: Attempt to create a POA with priority bands that do not
// match the lanes. Should get POA::InvalidPolicy exception.
ACE_DEBUG ((LM_DEBUG,
"\n<---Test--->: Bands do not match lanes\n\n"));
// False bands.
RTCORBA::PriorityBands false_bands (bands);
false_bands[0].low = 10000;
false_bands[0].high = 10005;
CORBA::PolicyList poa_policy_list;
poa_policy_list.length (2);
// Create a bands policy.
poa_policy_list[0] =
rt_orb->create_priority_banded_connection_policy (false_bands
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create a thread-pool policy.
poa_policy_list[1] =
rt_orb->create_threadpool_policy (threadpool_id
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Try to create a POA with invalid policies. Should throw an
// exception.
poa_creation_exception_test (root_poa.in (),
poa_manager.in (),
poa_policy_list
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Two policies for the next POA.
poa_policy_list.length (2);
// Create a priority model policy.
poa_policy_list[0] =
rt_orb->create_priority_model_policy (RTCORBA::CLIENT_PROPAGATED,
0
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create a thread-pool policy.
poa_policy_list[1] =
rt_orb->create_threadpool_policy (threadpool_id
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create POA with CLIENT_PROPAGATED priority model, with lanes
// but no bands.
PortableServer::POA_var client_propagated_poa =
root_poa->create_POA ("client_propagated_poa",
poa_manager.in (),
poa_policy_list
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Three policies for the next POA.
poa_policy_list.length (3);
// Default POA priority comes from the 'middle' lane's priority.
CORBA::Short poa_priority =
lanes[lanes.length () / 2].lane_priority;
// Create a priority model policy.
poa_policy_list[0] =
rt_orb->create_priority_model_policy (RTCORBA::SERVER_DECLARED,
poa_priority
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create a bands policy.
poa_policy_list[1] =
rt_orb->create_priority_banded_connection_policy (bands
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create a thread-pool policy.
poa_policy_list[2] =
rt_orb->create_threadpool_policy (threadpool_id
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create POA with SERVER_DECLARED priority model, with bands
// and lanes.
PortableServer::POA_var server_declared_poa =
root_poa->create_POA ("server_declared_poa",
poa_manager.in (),
poa_policy_list
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Test: Attempt to register an object with priority that
// doesn't match lanes. Should get BAD_PARAM exception.
ACE_DEBUG ((LM_DEBUG,
"\n<---Test--->: Servant priority does not match lanes\n\n"));
RTPortableServer::POA_var rt_server_declared_poa =
RTPortableServer::POA::_narrow (server_declared_poa.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Activation with incorrect priority should fail.
CORBA::Short wrong_priority = 10000;
object_activation_exception_test (rt_server_declared_poa.in (),
0,
wrong_priority
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Create first servant and register with <client_propagated_poa>.
Test_i server_impl (orb.in (),
bands
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
result = create_object (client_propagated_poa.in (),
orb.in (),
&server_impl,
ior_output_file1
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (result != 0)
return result;
// Create second servant and register with <server_declared_poa>.
Test_i server_impl2 (orb.in (),
bands
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
result = create_object (server_declared_poa.in (),
orb.in (),
&server_impl2,
ior_output_file2
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (result != 0)
return result;
// Activate POA manager.
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Run ORB.
orb->run (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// Destroy ORB.
orb->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCH (CORBA::INTERNAL, exception)
{
int minor_code =
exception.minor ();
if (ACE_BIT_ENABLED (minor_code, TAO_RTCORBA_THREAD_CREATION_LOCATION_CODE) &&
errno == EPERM)
{
ACE_ERROR_RETURN ((LM_ERROR,
"Cannot create thread with scheduling policy %s\n"
"because the user does not have the appropriate privileges, terminating program....\n"
"Check svc.conf options and/or run as root\n",
sched_policy_name (orb->orb_core ()->orb_params ()->ace_sched_policy ())),
2);
}
else
// Unexpected error.
ACE_ASSERT (0);
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION,
"Unexpected exception caught in Banded_Connections test server:");
return -1;
}
ACE_ENDTRY;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?