📄 driver.cpp
字号:
// Driver.cpp,v 1.7 2003/08/24 13:50:14 jwillemsen Exp
#include "Driver.h"
ACE_RCSID(lib, TAO_Driver, "Driver.cpp,v 1.7 2003/08/24 13:50:14 jwillemsen Exp")
#include "ace/Dynamic_Service.h"
#include "ace/Thread_Manager.h"
#include "ace/Arg_Shifter.h"
#include "ace/Argv_Type_Converter.h"
#include "tao/ORB.h"
#include "tao/ORB_Core.h"
#include "ace/Sched_Params.h"
#include "LookupManager.h"
#include "Command_Builder.h"
#include "Name.h"
#include "Activation_Manager.h"
const char *
sched_policy_name (int sched_policy)
{
const char *name = 0;
switch (sched_policy)
{
case ACE_SCHED_OTHER:
name = "SCHED_OTHER";
break;
case ACE_SCHED_RR:
name = "SCHED_RR";
break;
case ACE_SCHED_FIFO:
name = "SCHED_FIFO";
break;
}
return name;
}
void
check_supported_priorities (CORBA::ORB_ptr orb)
{
int sched_policy =
orb->orb_core ()->orb_params ()->ace_sched_policy ();
// Check that we have sufficient priority range to run this test,
// i.e., more than 1 priority level.
int max_priority =
ACE_Sched_Params::priority_max (sched_policy);
int min_priority =
ACE_Sched_Params::priority_min (sched_policy);
if (max_priority == min_priority)
{
ACE_DEBUG ((LM_DEBUG,
"Not enough priority levels with the %s scheduling policy\n"
"on this platform to run the test, terminating program....\n"
"Check svc.conf options\n",
sched_policy_name (sched_policy)));
ACE_OS::exit (2);
}
}
/*****************************************************************/
TAO_Notify_Tests_Worker::TAO_Notify_Tests_Worker (void)
{
}
void
TAO_Notify_Tests_Worker::command_builder (TAO_Notify_Tests_Command_Builder* cmd_builder)
{
this->cmd_builder_ = cmd_builder;
}
int
TAO_Notify_Tests_Worker::svc (void)
{
ACE_hthread_t current;
ACE_Thread::self (current);
int priority;
if (ACE_Thread::getprio (current, priority) == -1)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - Failed to get Worker thread priority\n")));
return -1;
}
ACE_DEBUG ((LM_ERROR, "Activated Worker Thread for commands @ priority:%d \n", priority));
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
ACE_DEBUG ((LM_DEBUG, "Running Commands... \n"));
this->cmd_builder_->execute (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "ORB run error\n");
}
ACE_ENDTRY;
ACE_DEBUG ((LM_DEBUG, "Finished executing commands\n"));
return 0;
}
/*****************************************************************/
TAO_Notify_Tests_ORB_Run_Worker::TAO_Notify_Tests_ORB_Run_Worker (void)
{
}
void
TAO_Notify_Tests_ORB_Run_Worker::orb (CORBA::ORB_ptr orb)
{
orb_ = CORBA::ORB::_duplicate (orb);
}
void
TAO_Notify_Tests_ORB_Run_Worker::run_period (ACE_Time_Value run_period)
{
this->run_period_ = run_period;
}
int
TAO_Notify_Tests_ORB_Run_Worker::svc (void)
{
ACE_hthread_t current;
ACE_Thread::self (current);
int priority;
if (ACE_Thread::getprio (current, priority) == -1)
{
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("TAO (%P|%t) - Failed to get Worker thread priority\n")));
return -1;
}
ACE_DEBUG ((LM_ERROR, "Activated ORB Run Worker Thread to run the ORB @ priority:%d \n", priority));
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
ACE_DEBUG ((LM_ERROR, "Running ORB, timeout in %d sec\n", this->run_period_.sec ()));
this->orb_->run (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
ACE_CATCHANY
{
}
ACE_ENDTRY;
return 0;
}
/*****************************************************************/
TAO_Notify_Tests_Driver::TAO_Notify_Tests_Driver (void)
:cmd_builder_ (0), activation_manager_ (0), run_period_ (0,0), skip_priority_levels_check_ (0)
{
this->activation_manager_ = new TAO_Notify_Tests_Activation_Manager ();
LOOKUP_MANAGER->_register (this->activation_manager_);
LOOKUP_MANAGER->_register (this);
}
TAO_Notify_Tests_Driver::~TAO_Notify_Tests_Driver ()
{
delete this->activation_manager_;
}
int
TAO_Notify_Tests_Driver::parse_args (int argc, char *argv[])
{
ACE_Arg_Shifter arg_shifter (argc, argv);
const ACE_TCHAR *current_arg = 0;
while (arg_shifter.is_anything_left ())
{
if ((current_arg = arg_shifter.get_the_parameter (ACE_LIB_TEXT("-Timeout")))) // -Timeout timeout_period_S
{
if (current_arg != 0)
{
this->run_period_ = ACE_Time_Value (ACE_OS::atoi (current_arg), 0);
}
arg_shifter.consume_arg ();
}
else if ((current_arg = arg_shifter.get_the_parameter (ACE_LIB_TEXT("-IORoutput")))) // -IORoutput file_name
{
if (this->activation_manager_->ior_output_file (current_arg) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"Unable to open %s for writing: %p\n",
current_arg), -1);
arg_shifter.consume_arg ();
}
else if ((current_arg = arg_shifter.get_the_parameter (ACE_LIB_TEXT("-IORinput")))) // -IORinput file_name
{
if (this->activation_manager_->ior_input_file (current_arg) == -1)
ACE_ERROR_RETURN ((LM_ERROR,
"Unable to open %s for reading: %p\n",
current_arg), -1);
arg_shifter.consume_arg ();
}
else if (arg_shifter.cur_arg_strncasecmp ("-Skip_Priority_Levels_Check") == 0) // Skip the check for multiple priority levels.
{
this->skip_priority_levels_check_ = 1;
arg_shifter.consume_arg ();
}
else
{
arg_shifter.ignore_arg ();
}
}
return 0;
}
int
TAO_Notify_Tests_Driver::init (int argc, ACE_TCHAR *argv[] ACE_ENV_ARG_DECL)
{
ACE_Argv_Type_Converter command_line(argc, argv);
this->orb_ = CORBA::ORB_init (command_line.get_argc(),
command_line.get_ASCII_argv(),
""
ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
if (this->parse_args (argc, argv) == -1)
return -1;
// Make sure we can support multiple priorities that are required
// for this test.
if (skip_priority_levels_check_ == 0)
check_supported_priorities (this->orb_.in());
LOOKUP_MANAGER->init (this->orb_.in () ACE_ENV_ARG_PARAMETER);
ACE_CHECK_RETURN (-1);
this->cmd_builder_ =
ACE_Dynamic_Service<TAO_Notify_Tests_Command_Builder>::instance (TAO_Notify_Tests_Name::command_builder);
worker_.command_builder (this->cmd_builder_);
// Set the run period.
if (this->run_period_ != ACE_Time_Value::zero)
this->orb_run_worker_.run_period (this->run_period_);
// Set the ORB
this->orb_run_worker_.orb (this->orb_.in ());
return 0;
}
void
TAO_Notify_Tests_Driver::run (ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
{
// Task activation flags.
long flags =
THR_NEW_LWP |
THR_JOINABLE |
this->orb_->orb_core ()->orb_params ()->thread_creation_flags ();
// Become an active object.
int priority = ACE_Sched_Params::priority_min (this->orb_->orb_core ()->orb_params ()->sched_policy ()
, this->orb_->orb_core ()->orb_params ()->scope_policy ());
// Become an active object.
if (this->worker_.activate (flags, 1, 0, priority) == -1)
{
if (ACE_OS::last_error () == EPERM)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("Insufficient privilege to activate ACE_Task.\n")));
else
ACE_DEBUG ((LM_ERROR,
ACE_TEXT ("(%t) Task activation at priority %d failed, ")
ACE_TEXT ("exiting!\n%a"),
ACE_DEFAULT_THREAD_PRIORITY,
-1));
}
// Activate the ORB run worker.
if (this->orb_run_worker_.activate (flags, 1, 0, priority) == -1)
{
if (ACE_OS::last_error () == EPERM)
ACE_ERROR ((LM_ERROR,
ACE_TEXT ("Insufficient privilege to activate ACE_Task.\n")));
else
ACE_DEBUG ((LM_ERROR,
ACE_TEXT ("(%t) Task activation at priority %d failed, ")
ACE_TEXT ("exiting!\n%a"),
ACE_DEFAULT_THREAD_PRIORITY,
-1));
}
// Wait till we're done.
this->orb_run_worker_.thr_mgr ()->wait ();
this->worker_.thr_mgr ()->wait ();
}
void
TAO_Notify_Tests_Driver::shutdown (void)
{
this->orb_->shutdown ();
}
#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
template class ACE_Dynamic_Service<TAO_Notify_Tests_Command_Builder>;
#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
#pragma instantiate ACE_Dynamic_Service<TAO_Notify_Tests_Command_Builder>
#endif /*ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -