summaryrefslogtreecommitdiff
path: root/ACE/Kokyu/tests/DSRT_MIF/MIF.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/Kokyu/tests/DSRT_MIF/MIF.cpp')
-rw-r--r--ACE/Kokyu/tests/DSRT_MIF/MIF.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/ACE/Kokyu/tests/DSRT_MIF/MIF.cpp b/ACE/Kokyu/tests/DSRT_MIF/MIF.cpp
new file mode 100644
index 00000000000..e5fd6f5cdff
--- /dev/null
+++ b/ACE/Kokyu/tests/DSRT_MIF/MIF.cpp
@@ -0,0 +1,185 @@
+// $Id$
+
+#include "ace/ACE.h"
+#include "ace/Auto_Ptr.h"
+#include "ace/Task.h"
+#include "ace/Sched_Params.h"
+#include "ace/Atomic_Op.h"
+#include "ace/High_Res_Timer.h"
+#include "ace/Barrier.h"
+#include "ace/Lock_Adapter_T.h"
+#include "ace/Countdown_Time.h"
+
+#include "Kokyu_dsrt.h"
+
+ACE_Atomic_Op<ACE_SYNCH_MUTEX, long> guid=0;
+
+struct mif_scheduler_traits
+{
+ typedef int Guid_t;
+
+ struct QoSDescriptor_t
+ {
+ typedef long Importance_t;
+
+ long importance_;
+ };
+
+ /*
+ static Time_t now()
+ {
+ ACE_Time_Value now = ACE_OS::gettimeofday ();
+ return now.sec () * 10000000 + now.usec () * 10;
+ }
+ */
+
+ typedef Kokyu::MIF_Comparator<QoSDescriptor_t> QoSComparator_t;
+
+ struct Guid_Hash
+ {
+ u_long operator () (const Guid_t& guid)
+ {
+ return guid;
+ }
+ };
+};
+
+
+class MyTask : public ACE_Task_Base
+{
+public:
+
+ MyTask (ACE_Barrier& bar,
+ Kokyu::DSRT_Dispatcher<mif_scheduler_traits>* dispatcher,
+ mif_scheduler_traits::QoSDescriptor_t& qos,
+ int exec_duration)
+ :barrier_ (bar),
+ dispatcher_ (dispatcher),
+ qos_ (qos),
+ guid_ (++guid),
+ exec_duration_ (exec_duration)
+ {}
+
+ int svc (void);
+
+ private:
+ ACE_Barrier& barrier_;
+ Kokyu::DSRT_Dispatcher<mif_scheduler_traits>* dispatcher_;
+ mif_scheduler_traits::QoSDescriptor_t qos_;
+ mif_scheduler_traits::Guid_t guid_;
+ int exec_duration_;
+};
+
+int MyTask::svc (void)
+{
+ ACE_hthread_t thr_handle;
+ ACE_Thread::self (thr_handle);
+
+ ACE_DEBUG ((LM_DEBUG, "(%t|%T): task activated\n"));
+ ACE_ASSERT (dispatcher_ != 0);
+
+ (void) dispatcher_->schedule (guid_, qos_);
+
+ barrier_.wait ();
+
+ long prime_number = 9619899;
+
+ ACE_High_Res_Timer timer;
+ ACE_Time_Value elapsed_time;
+ ACE_Time_Value seconds_tracker(0,0);
+
+ ACE_Time_Value one_second (1,0);
+ ACE_Time_Value compute_count_down_time (exec_duration_, 0);
+ ACE_Countdown_Time compute_count_down (&compute_count_down_time);
+
+ timer.start ();
+ while (compute_count_down_time > ACE_Time_Value::zero)
+ {
+ ACE::is_prime (prime_number,
+ 2,
+ prime_number / 2);
+
+ compute_count_down.update ();
+ timer.stop ();
+ timer.elapsed_time (elapsed_time);
+ seconds_tracker += elapsed_time;
+ if (seconds_tracker >= one_second)
+ {
+ seconds_tracker.set (0,0);
+ ACE_DEBUG ((LM_DEBUG,
+ ACE_TEXT ("(%t) Currently running guid=%d")
+ ACE_TEXT (", qos_.importance=%d\n"),
+ guid_, qos_.importance_));
+ }
+ timer.reset ();
+ timer.start ();
+ }
+
+ dispatcher_->cancel_schedule (this->guid_);
+ return 0;
+}
+
+int ACE_TMAIN (int,ACE_TCHAR**)
+{
+ Kokyu::DSRT_ConfigInfo config_info;
+
+ // config_info.scheduler_type_ = Kokyu::SCHED_MIF;
+ config_info.impl_type_ = Kokyu::DSRT_OS_BASED;
+
+ ACE_Barrier bar (3);
+
+ ACE_DEBUG ((LM_DEBUG, "before create_dispatcher\n" ));
+
+ config_info.sched_strategy_ = Kokyu::DSRT_MIF;
+
+ Kokyu::DSRT_Dispatcher_Factory<mif_scheduler_traits>::DSRT_Dispatcher_Auto_Ptr
+ disp (Kokyu::DSRT_Dispatcher_Factory<mif_scheduler_traits>::
+ create_DSRT_dispatcher (config_info));
+
+ ACE_DEBUG ((LM_DEBUG, "after create_dispatcher\n" ));
+
+ ACE_ASSERT (disp.get () != 0);
+
+ mif_scheduler_traits::QoSDescriptor_t qos1, qos2, qos3;
+
+ qos1.importance_ = 1;
+ qos2.importance_ = 2;
+ qos3.importance_ = 3;
+
+ MyTask mytask1 (bar, disp.get (), qos1, 15);
+ MyTask mytask2 (bar, disp.get (), qos2, 6);
+ MyTask mytask3 (bar, disp.get (), qos3, 4);
+
+ long flags = THR_BOUND | THR_SCHED_FIFO;
+
+ if (mytask1.activate (flags) == -1)
+ {
+ flags = THR_BOUND;
+ if (mytask1.activate (flags) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate task\n"));
+ }
+
+ if (mytask2.activate (flags) == -1)
+ {
+ flags = THR_BOUND;
+ if (mytask2.activate (flags) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate task\n"));
+ }
+
+ if (mytask3.activate (flags) == -1)
+ {
+ flags = THR_BOUND;
+ if (mytask3.activate (flags) == -1)
+ ACE_ERROR ((LM_ERROR,
+ "EC (%P|%t) cannot activate task\n"));
+ }
+
+ disp->shutdown ();
+
+ ACE_DEBUG ((LM_DEBUG, "main thread exiting\n"));
+
+ return 0;
+}
+