From e35775cb463d7e3ddbf7ccc9044c5910973856a0 Mon Sep 17 00:00:00 2001 From: huangming Date: Wed, 26 Nov 2003 03:04:34 +0000 Subject: *** empty log message *** --- .../Event_Service/FT_EventService.cpp | 36 ++++++++++-- .../AMI_Primary_Replication_Strategy.cpp | 3 +- .../FtRtEvent/EventChannel/Fault_Detector.cpp | 3 +- TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp | 66 ++++++++++++++++++++++ TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h | 23 ++++++++ TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp | 4 ++ TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp | 2 +- TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp | 4 +- 8 files changed, 132 insertions(+), 9 deletions(-) create mode 100644 TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp create mode 100644 TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h diff --git a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp index 334b0a4c207..24e33bbab5b 100644 --- a/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp +++ b/TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp @@ -12,11 +12,22 @@ #include "orbsvcs/FtRtEvent/EventChannel/FTRTEC_ServiceActivate.h" #include "orbsvcs/FtRtEvent/EventChannel/Replication_Service.h" #include "orbsvcs/FtRtEvent/Utils/Log.h" +#include "orbsvcs/FtRtEvent/Utils/RT_Task.h" +#ifndef WIN32 +#include +#endif ACE_RCSID (Event_Service, FT_EventService, "$Id$") +static int time_to_crash; + +extern "C" void crash_handler(int) +{ + ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashed\n")); + exit(1); +} class Fault_Event_Service : public TAO_FTEC_Event_Channel { @@ -48,8 +59,20 @@ void Fault_Event_Service::push (const FtRtecEventChannelAdmin::ObjectId & oid, ACE_THROW_SPEC ((CORBA::SystemException, FtRtecEventComm::InvalidObjectID)) { if (fault_no_ == msg_count_++) { - ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashing on %d-th message\n", msg_count_-1)); - exit(1); +#ifndef WIN32 + if (time_to_crash > 0) { + signal(SIGALRM, &crash_handler); + struct itimerval in, out; + in.it_value.tv_sec = time_to_crash/1000; + in.it_value.tv_usec = (time_to_crash%1000)*1000; + setitimer(ITIMER_REAL, &in, &out); + } + else +#endif + { + ACE_DEBUG((LM_DEBUG, "FTRT_Event_Service crashing on %d-th message\n", msg_count_-1)); + exit(1); + } } TAO_FTEC_Event_Channel::push(oid, data ACE_ENV_ARG_PARAMETER); } @@ -58,6 +81,8 @@ void Fault_Event_Service::push (const FtRtecEventChannelAdmin::ObjectId & oid, int ACE_TMAIN (int argc, ACE_TCHAR* argv[]) { + RT_Task::set_current(); + FT_EventService event_service; return event_service.run (argc, argv); } @@ -176,7 +201,7 @@ FT_EventService::parse_args (int argc, ACE_TCHAR* argv []) } } - ACE_Get_Opt get_opt (argc, argv, ACE_LIB_TEXT("d:f:jps:")); + ACE_Get_Opt get_opt (argc, argv, ACE_LIB_TEXT("d:f:jps:t:")); int opt; while ((opt = get_opt ()) != EOF) @@ -217,11 +242,14 @@ FT_EventService::parse_args (int argc, ACE_TCHAR* argv []) this->global_scheduler_ = 0; } break; - + case 't': + time_to_crash = atoi(get_opt.opt_arg ()); + break; case '?': default: ACE_DEBUG ((LM_DEBUG, ACE_LIB_TEXT("Usage: %s \n") + ACE_LIB_TEXT(" -d debug level\n") ACE_LIB_TEXT(" -j join the object group\n") ACE_LIB_TEXT(" -p set as primary\n") ACE_LIB_TEXT(" -s \n") diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp index 91973a8a12c..ac687b61bd9 100644 --- a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp +++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp @@ -12,6 +12,7 @@ #include "../Utils/resolve_init.h" #include "../Utils/ScopeGuard.h" #include "../Utils/Log.h" +#include "../Utils/RT_Task.h" ACE_RCSID (EventChannel, AMI_Primary_Replication_Strategy, @@ -46,7 +47,7 @@ int AMI_Primary_Replication_Strategy::release (void) int AMI_Primary_Replication_Strategy::init() { - return this->activate(); + return RT_Task::activate(this); } int AMI_Primary_Replication_Strategy::svc() diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp index 1153b624382..2f85db8b337 100644 --- a/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp +++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp @@ -3,6 +3,7 @@ #include "ace/Reactor.h" #include "Fault_Detector.h" #include "ace/Select_Reactor.h" +#include "../Utils/RT_Task.h" ACE_RCSID (EventChannel, Fault_Detector, @@ -47,7 +48,7 @@ int Fault_Detector::init(int argc, char** argv) this->init_acceptor() ==0) { if (!reactor_task_.thr_count() && - reactor_task_.activate (THR_NEW_LWP | THR_JOINABLE, 1) != 0) + RT_Task::activate(&reactor_task_) != 0) ACE_ERROR_RETURN ((LM_ERROR,"Cannot activate reactor thread\n"), -1); return 0; diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp new file mode 100644 index 00000000000..a846646ab24 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp @@ -0,0 +1,66 @@ +//$Id$ +#include "RT_Task.h" +#include "ace/Task.h" +#include "ace/Sched_Params.h" + +void RT_Task::set_current() +{ + if (ACE_OS::thr_setprio(ACE_SCHED_FIFO) == -1){ + ACE_DEBUG((LM_DEBUG, "Cannot set the thread to RT class")); + } +} + +int RT_Task::activate(ACE_Task_Base* task) +{ + long priority = ACE_Sched_Params::priority_max(ACE_SCHED_FIFO); + long flags = THR_NEW_LWP; + + // To get FIFO scheduling with PTHREADS. + ACE_SET_BITS (flags, + THR_SCHED_FIFO); + + // Become an active object. + if (task->activate (flags, + 1, + 0, + priority) == -1) + { + // On Linux, for example, only the superuser can set the policy + // to other than ACE_SCHED_OTHER. But with ACE_SCHED_OTHER, + // there is only one thread priority value, for example, 0. So, + // let the superuser run an interesting test, but for other + // users use the minimum ACE_SCHED_OTHER thread priority. + + long fallback_priority = + ACE_Sched_Params::priority_min (ACE_SCHED_OTHER, + ACE_SCOPE_THREAD); + + ACE_DEBUG ((LM_DEBUG, + ACE_TEXT ("(%t) task activation at priority %d with ") + ACE_TEXT ("flags 0x%X failed; retry at priority %d with ") + ACE_TEXT ("flags 0x%X (errno is %d%p)\n"), + priority, + flags, + fallback_priority, + THR_NEW_LWP, + errno, + ACE_TEXT (""))); + + flags = THR_NEW_LWP; + priority = fallback_priority; + + if (task->activate (flags, + 1, + 1, + priority) == -1) + { + + ACE_DEBUG ((LM_ERROR, + ACE_TEXT ("(%t) task activation at priority %d failed, ") + ACE_TEXT ("exiting!\n%a"), + priority, + -1)); + } + } + return 0; +} diff --git a/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h new file mode 100644 index 00000000000..c19543e6f11 --- /dev/null +++ b/TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h @@ -0,0 +1,23 @@ +// -*- C++ -*- +//============================================================================= +/** + * @file RT_Task.h + * + * $Id$ + * + * @author Huang-Ming Huang + */ +//============================================================================= +#ifndef RT_TASK_H +#define RT_TASK_H + +class ACE_Task_Base; + +class RT_Task +{ +public: + static void set_current(); + static int activate(ACE_Task_Base*); +}; + +#endif diff --git a/TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp b/TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp index 820e9d54772..dc211e24f54 100644 --- a/TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp +++ b/TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp @@ -5,6 +5,8 @@ #include "orbsvcs/FtRtEvent/Utils/resolve_init.h" #include "orbsvcs/FtRtEvent/Utils/FTEC_Gateway.h" #include "orbsvcs/FtRtEvent/Utils/Log.h" +#include "orbsvcs/FtRtEvent/Utils/RT_Task.h" + /// include this file to statically linked with FT ORB #include "orbsvcs/FaultTolerance/FT_ClientService_Activate.h" @@ -120,6 +122,8 @@ FtRtEvent_Test_Base::get_event_channel(ACE_ENV_SINGLE_ARG_DECL) int FtRtEvent_Test_Base::run(int argc, ACE_TCHAR** argv) { + RT_Task::set_current(); + ACE_DECLARE_NEW_CORBA_ENV; ACE_TRY { orb_ = CORBA::ORB_init(argc, argv, "" diff --git a/TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp b/TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp index ee8dbe1319c..d36e60951f9 100644 --- a/TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp +++ b/TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp @@ -56,7 +56,7 @@ int PushConsumer_impl::init(CORBA::ORB_ptr orb, time_val = ACE_OS::gettimeofday () - time_val; - ACE_DEBUG((LM_DEBUG, "connected to proxy_push_supplier, subscription latency = %d\n", time_val.sec () * 10000000 + time_val.usec ()* 10)); + ACE_DEBUG((LM_DEBUG, "connected to proxy_push_supplier, subscription latency = %d\n", time_val.sec () * 1000000 + time_val.usec ())); return 0; } diff --git a/TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp b/TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp index 4acd8a08c84..78f82c42b3d 100644 --- a/TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp +++ b/TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp @@ -84,7 +84,7 @@ int PushSupplier_impl::init(CORBA::ORB_ptr orb, time_val = ACE_OS::gettimeofday () - time_val; - ACE_DEBUG((LM_DEBUG, "connected to proxy_push_consumer, subscription latency = %d\n", time_val.sec () * 10000000 + time_val.usec ()* 10)); + ACE_DEBUG((LM_DEBUG, "connected to proxy_push_consumer, subscription latency = %d\n", time_val.sec () * 1000000 + time_val.usec ())); } ACE_CATCHANY { @@ -154,7 +154,7 @@ int PushSupplier_impl::handle_timeout (const ACE_Time_Value ¤t_time, ACE_Time_Value time_val = ACE_OS::gettimeofday (); TAO_FTRTEC::Log(1, "sending data %d\n", seq_no_); - event[0].header.ec_send_time = time_val.sec () * 10000000 + time_val.usec ()* 10; + event[0].header.ec_send_time = time_val.sec () * 10000000 + time_val.usec ()*10; event[0].data.any_value <<= seq_no_; bool final = (num_iterations_ == (int) seq_no_++); -- cgit v1.2.1