📄 ec_multiple.cpp
字号:
// EC_Multiple.cpp,v 1.72 2003/11/04 05:21:33 dhinton Exp
#include "EC_Multiple.h"
#include "Scheduler_Runtime1.h"
#include "Scheduler_Runtime2.h"
#include "Scheduler_Runtime_Dynamic.h" /* infos_3 */
#include "orbsvcs/Event_Utilities.h"
#include "orbsvcs/Event_Service_Constants.h"
#include "orbsvcs/Scheduler_Factory.h"
#include "orbsvcs/Time_Utilities.h"
#include "orbsvcs/RtecEventChannelAdminC.h"
#include "orbsvcs/Sched/Config_Scheduler.h"
#include "orbsvcs/Runtime_Scheduler.h"
#include "orbsvcs/Event/Event_Channel.h"
#include "tao/ORB_Core.h"
#include "ace/Get_Opt.h"
#include "ace/Auto_Ptr.h"
#include "ace/Sched_Params.h"
#include "ace/OS_NS_errno.h"
#include "ace/OS_NS_strings.h"
#if defined (sun)
# include <sys/lwp.h> /* for _lwp_self */
#endif /* sun */
ACE_RCSID(EC_Multiple, EC_Multiple, "EC_Multiple.cpp,v 1.72 2003/11/04 05:21:33 dhinton Exp")
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Auto_Basic_Ptr<POA_RtecScheduler::Scheduler>;
template class ACE_PushConsumer_Adapter<Test_Supplier>;
template class auto_ptr<POA_RtecScheduler::Scheduler>;
#elif defined(ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Auto_Basic_Ptr<POA_RtecScheduler::Scheduler>
#pragma instantiate ACE_PushConsumer_Adapter<Test_Supplier>
#pragma instantiate auto_ptr<POA_RtecScheduler::Scheduler>
#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
Test_ECG::Test_ECG (void)
: lcl_name_ ("Test_ECG"),
rmt_name_ (0),
scheduling_type_ (Test_ECG::ss_runtime),
consumer_disconnects_ (0),
supplier_disconnects_ (0),
short_circuit_ (0),
hp_suppliers_ (1),
hp_consumers_ (1),
hp_workload_ (10),
hp_interval_ (25000),
hp_message_count_ (200),
hps_event_a_ (ACE_ES_EVENT_UNDEFINED),
hps_event_b_ (ACE_ES_EVENT_UNDEFINED + 1),
hpc_event_a_ (ACE_ES_EVENT_UNDEFINED),
hpc_event_b_ (ACE_ES_EVENT_UNDEFINED + 1),
lp_suppliers_ (0),
lp_consumers_ (0),
lp_workload_ (0),
lp_interval_ (100000),
lp_message_count_ (50),
lps_event_a_ (0),
lps_event_b_ (0),
lpc_event_a_ (0),
lpc_event_b_ (0),
schedule_file_ (0),
pid_file_name_ (0),
ready_ (0),
ready_cnd_ (ready_mtx_)
{
}
void
print_priority_info (const char *const name)
{
#if defined (ACE_HAS_PTHREADS_STD) || defined (sun)
#if defined (ACE_HAS_PTHREADS_STD)
struct sched_param param;
int policy, status;
if ((status = pthread_getschedparam (pthread_self (), &policy,
¶m)) == 0) {
# ifdef sun
ACE_DEBUG ((LM_DEBUG,
"%s (%lu|%u); policy is %d, priority is %d\n",
name,
ACE_OS::getpid (),
_lwp_self (),
pthread_self (),
policy, param.sched_priority));
# else /* ! sun */
ACE_DEBUG ((LM_DEBUG,
"%s (%lu|%u); policy is %d, priority is %d\n",
name,
ACE_OS::getpid (),
0,
pthread_self (),
policy, param.sched_priority ));
# endif /* ! sun */
} else {
ACE_DEBUG ((LM_DEBUG,"pthread_getschedparam failed: %d\n", status));
}
#endif /* ACE_HAS_PTHREADS_STD */
#ifdef sun
// Find what scheduling class the thread's LWP is in.
ACE_Sched_Params sched_params (ACE_SCHED_OTHER, 0);
if (ACE_OS::lwp_getparams (sched_params) == -1)
{
ACE_OS::perror ("ACE_OS::lwp_getparams");
return;
}
else if (sched_params.policy () == ACE_SCHED_FIFO ||
sched_params.policy () == ACE_SCHED_RR)
{
// This thread's LWP is in the RT class.
ACE_DEBUG ((LM_DEBUG,
"RT class; priority: %d, quantum: %u msec\n",
sched_params.priority (),
sched_params.quantum ().msec ()));
}
else
{
ACE_DEBUG ((LM_DEBUG,
"TS class; priority: %d\n",
sched_params.priority ()));
}
#endif /* sun */
#else
ACE_UNUSED_ARG (name);
#endif /* ACE_HAS_PTHREADS_STD */
}
int
Test_ECG::run (int argc, char* argv[])
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
CORBA::ORB_var orb =
CORBA::ORB_init (argc, argv, "" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::Object_var poa_object =
orb->resolve_initial_references("RootPOA"
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (poa_object.in ()))
ACE_ERROR_RETURN ((LM_ERROR,
" (%P|%t) Unable to initialize the POA.\n"),
1);
PortableServer::POA_var root_poa =
PortableServer::POA::_narrow (poa_object.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
PortableServer::POAManager_var poa_manager =
root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
if (this->parse_args (argc, argv))
return 1;
ACE_DEBUG ((LM_DEBUG,
"Execution parameters:\n"
" lcl name = <%s>\n"
" rmt name = <%s>\n"
" scheduler type = <%d>\n"
" consumer disconnects = <%d>\n"
" supplier disconnects = <%d>\n"
" short circuit EC = <%d>\n"
" HP suppliers = <%d>\n"
" HP consumers = <%d>\n"
" HP workload = <%d> (iterations)\n"
" HP interval between events = <%d> (usecs)\n"
" HP message count = <%d>\n"
" HP supplier Event A = <%d>\n"
" HP supplier Event B = <%d>\n"
" HP consumer Event A = <%d>\n"
" HP consumer Event B = <%d>\n"
" LP suppliers = <%d>\n"
" LP consumers = <%d>\n"
" LP workload = <%d> (iterations)\n"
" LP interval between events = <%d> (usecs)\n"
" LP message count = <%d>\n"
" LP supplier Event A = <%d>\n"
" LP supplier Event B = <%d>\n"
" LP consumer Event A = <%d>\n"
" LP consumer Event B = <%d>\n"
" schedule_file = <%s>\n"
" pid file name = <%s>\n",
this->lcl_name_?this->lcl_name_:"nil",
this->rmt_name_?this->rmt_name_:"nil",
this->scheduling_type_,
this->consumer_disconnects_,
this->supplier_disconnects_,
this->short_circuit_,
this->hp_suppliers_,
this->hp_consumers_,
this->hp_workload_,
this->hp_interval_,
this->hp_message_count_,
this->hps_event_a_,
this->hps_event_b_,
this->hpc_event_a_,
this->hpc_event_b_,
this->lp_suppliers_,
this->lp_consumers_,
this->lp_workload_,
this->lp_interval_,
this->lp_message_count_,
this->lps_event_a_,
this->lps_event_b_,
this->lpc_event_a_,
this->lpc_event_b_,
this->schedule_file_?this->schedule_file_:"nil",
this->pid_file_name_?this->pid_file_name_:"nil") );
print_priority_info ("Test_ECG::run (Main)");
if (this->pid_file_name_ != 0)
{
FILE* pid = ACE_OS::fopen (this->pid_file_name_, "w");
if (pid != 0)
{
ACE_OS::fprintf (pid, "%ld\n",
ACE_static_cast (long, ACE_OS::getpid ()));
ACE_OS::fclose (pid);
}
}
int min_priority =
ACE_Sched_Params::priority_min (ACE_SCHED_FIFO);
// Enable FIFO scheduling, e.g., RT scheduling class on Solaris.
if (ACE_OS::sched_params (ACE_Sched_Params (ACE_SCHED_FIFO,
min_priority,
ACE_SCOPE_PROCESS)) != 0)
{
if (ACE_OS::last_error () == EPERM)
ACE_DEBUG ((LM_DEBUG,
"%s: user is not superuser, "
"so remain in time-sharing class\n", argv[0]));
else
ACE_ERROR ((LM_ERROR,
"%s: ACE_OS::sched_params failed\n", argv[0]));
}
if (ACE_OS::thr_setprio (min_priority) == -1)
{
ACE_ERROR ((LM_ERROR, "(%P|%t) main thr_setprio failed\n"));
}
print_priority_info ("Test_ECG::run (Main after thr_setprio)");
CORBA::Object_var naming_obj =
orb->resolve_initial_references ("NameService" ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (naming_obj.in ()))
ACE_ERROR_RETURN ((LM_ERROR,
" (%P|%t) Unable to get the Naming Service.\n"),
1);
CosNaming::NamingContext_var naming_context =
CosNaming::NamingContext::_narrow (naming_obj.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
auto_ptr<POA_RtecScheduler::Scheduler> scheduler_impl;
RtecScheduler::Scheduler_var scheduler;
switch (this->scheduling_type_)
{
default:
ACE_ERROR ((LM_WARNING, "Unknown scheduling type %d\n",
this->scheduling_type_));
/*FALLTHROUGH*/
case Test_ECG::ss_global:
break;
case Test_ECG::ss_local:
{
auto_ptr<POA_RtecScheduler::Scheduler> auto_scheduler_impl (new ACE_Config_Scheduler);
scheduler_impl = auto_scheduler_impl;
}
if (scheduler_impl.get () == 0)
return -1;
scheduler = scheduler_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
break;
case Test_ECG::ss_runtime:
if (ACE_OS::strcmp (this->lcl_name_, "ECM1") == 0)
{
// This setups Scheduler_Factory to use the runtime version
ACE_Scheduler_Factory::use_runtime (
sizeof (runtime_configs_1)/sizeof (runtime_configs_1[0]),
runtime_configs_1,
sizeof (runtime_infos_1)/sizeof (runtime_infos_1[0]),
runtime_infos_1);
auto_ptr<POA_RtecScheduler::Scheduler> auto_scheduler_impl
(new ACE_Runtime_Scheduler (runtime_configs_1_size,
runtime_configs_1,
runtime_infos_1_size,
runtime_infos_1));
scheduler_impl = auto_scheduler_impl;
if (scheduler_impl.get () == 0)
return -1;
scheduler = scheduler_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
else if (ACE_OS::strcmp (this->lcl_name_, "ECM2") == 0)
{
// This setups Scheduler_Factory to use the runtime version
ACE_Scheduler_Factory::use_runtime (
sizeof (runtime_configs_2)/sizeof (runtime_configs_2[0]),
runtime_configs_2,
sizeof (runtime_infos_2)/sizeof (runtime_infos_2[0]),
runtime_infos_2);
auto_ptr<POA_RtecScheduler::Scheduler> auto_scheduler_impl
(new ACE_Runtime_Scheduler (runtime_configs_2_size,
runtime_configs_2,
runtime_infos_2_size,
runtime_infos_2));
scheduler_impl = auto_scheduler_impl;
if (scheduler_impl.get () == 0)
return -1;
scheduler = scheduler_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
else if (ACE_OS::strcmp (this->lcl_name_, "ECM3") == 0)
{
// This setups Scheduler_Factory to use the runtime version
ACE_Scheduler_Factory::use_runtime (
sizeof (runtime_configs_3)/sizeof (runtime_configs_3[0]),
runtime_configs_3,
sizeof (runtime_infos_3)/sizeof (runtime_infos_3[0]),
runtime_infos_3);
auto_ptr<POA_RtecScheduler::Scheduler> auto_scheduler_impl
(new ACE_Runtime_Scheduler (runtime_configs_3_size,
runtime_configs_3,
runtime_infos_3_size,
runtime_infos_3));
scheduler_impl = auto_scheduler_impl;
if (scheduler_impl.get () == 0)
return -1;
scheduler = scheduler_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
else
{
ACE_ERROR ((LM_WARNING,
"Unknown name <%s> defaulting to "
"config scheduler\n", this->lcl_name_));
auto_ptr<POA_RtecScheduler::Scheduler> auto_scheduler_impl (new ACE_Config_Scheduler);
scheduler_impl = auto_scheduler_impl;
if (scheduler_impl.get () == 0)
return -1;
scheduler = scheduler_impl->_this (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
break;
}
// We use this buffer to generate the names of the local
// services.
const int bufsize = 512;
char buf[bufsize];
// Register the scheduler with the naming service.
switch (this->scheduling_type_)
{
default:
case Test_ECG::ss_global:
break;
case Test_ECG::ss_local:
case Test_ECG::ss_runtime:
{
CORBA::String_var str =
orb->object_to_string (scheduler.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
ACE_DEBUG ((LM_DEBUG, "The (local) scheduler IOR is <%s>\n",
str.in ()));
ACE_OS::strcpy (buf, "ScheduleService@");
ACE_OS::strcat (buf, this->lcl_name_);
// Register the servant with the Naming Context....
CosNaming::Name schedule_name (1);
schedule_name.length (1);
schedule_name[0].id = CORBA::string_dup (buf);
naming_context->bind (schedule_name, scheduler.in () ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -