summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuangming <huangminghuang@users.noreply.github.com>2003-11-26 03:04:34 +0000
committerhuangming <huangminghuang@users.noreply.github.com>2003-11-26 03:04:34 +0000
commite35775cb463d7e3ddbf7ccc9044c5910973856a0 (patch)
tree568ace73980120965bfdb9ec91b2429c7478e0e0
parentc0b9701fc0d9e8ef4d890ad6e79014d3b70de75d (diff)
downloadATCD-e35775cb463d7e3ddbf7ccc9044c5910973856a0.tar.gz
*** empty log message ***
-rw-r--r--TAO/orbsvcs/FTRT_Event_Service/Event_Service/FT_EventService.cpp36
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/AMI_Primary_Replication_Strategy.cpp3
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/EventChannel/Fault_Detector.cpp3
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.cpp66
-rw-r--r--TAO/orbsvcs/orbsvcs/FtRtEvent/Utils/RT_Task.h23
-rw-r--r--TAO/orbsvcs/tests/FtRtEvent/FtRtEvent_Test.cpp4
-rw-r--r--TAO/orbsvcs/tests/FtRtEvent/PushConsumer.cpp2
-rw-r--r--TAO/orbsvcs/tests/FtRtEvent/PushSupplier.cpp4
8 files changed, 132 insertions, 9 deletions
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 <sys/time.h>
+#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 <global|local> \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 <hh1@cse.wustl.edu>
+ */
+//=============================================================================
+#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 &current_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_++);