summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/Sched/DynSched_Test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/Sched/DynSched_Test.cpp')
-rw-r--r--TAO/orbsvcs/tests/Sched/DynSched_Test.cpp320
1 files changed, 320 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/Sched/DynSched_Test.cpp b/TAO/orbsvcs/tests/Sched/DynSched_Test.cpp
new file mode 100644
index 00000000000..fe06daf6ba8
--- /dev/null
+++ b/TAO/orbsvcs/tests/Sched/DynSched_Test.cpp
@@ -0,0 +1,320 @@
+// $Id$
+
+#include "orbsvcs/Sched/Strategy_Scheduler.h"
+#include "orbsvcs/Time_Utilities.h"
+#if defined (ACE_HAS_QUANTIFY)
+# include <quantify.h>
+#endif /* ACE_HAS_QUANTIFY */
+
+ACE_RCSID (Sched,
+ DynSched_Test,
+ "$Id$")
+
+// period times, in 100 nanoseconds
+#define ONE_HZ 10000000
+#define FIVE_HZ 2000000
+#define TEN_HZ 1000000
+#define TWENTY_HZ 500000
+
+class DynSched_Test
+ // = TITLE
+ // DynSched Test wrapper
+ // = DESCRIPTION
+ // Wraps static functions for test
+{
+public:
+
+ static void setup_rt_info (RtecScheduler::RT_Info &info,
+ const char *entry_point,
+ u_long period,
+ RtecScheduler::Time execution,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Importance_t importance,
+ u_long threads);
+ // Initializes an RT_Info.
+
+ static int register_rt_info (ACE_DynScheduler &scheduler,
+ RtecScheduler::RT_Info &info);
+ // Registers an RT_Info.
+
+
+#if 0 /* not currently used */
+ static void setup_conjunction (RtecScheduler::RT_Info &info,
+ const char *entry_point);
+ // Sets up a conjunction.
+
+ static void setup_disjunction (RtecScheduler::RT_Info &info,
+ const char *entry_point);
+ // Sets up a disjunction.
+
+#endif /* not currently used */
+
+ static int run_schedule (ACE_Scheduler_Strategy &strategy,
+ const char *output_filename,
+ const char *heading);
+ // Creates the schedule, runs timelines.
+
+};
+
+
+// Initializes an RT_Info.
+
+void
+DynSched_Test::setup_rt_info (RtecScheduler::RT_Info &info,
+ const char *entry_point,
+ u_long period,
+ RtecScheduler::Time execution,
+ RtecScheduler::Criticality_t criticality,
+ RtecScheduler::Importance_t importance,
+ u_long threads)
+{
+ // copy the passed entry point string into the RT_Info
+ info.entry_point = CORBA::string_dup (entry_point);
+
+ // initialize other values
+ info.handle = 0;
+ info.worst_case_execution_time = execution;
+ info.typical_execution_time = execution;
+ info.cached_execution_time = ORBSVCS_Time::zero ();
+ info.period = period;
+ info.criticality = criticality;
+ info.importance = importance;
+ info.quantum = ORBSVCS_Time::zero ();
+ info.threads = threads;
+ info.priority = 0;
+ info.preemption_subpriority = 0;
+ info.preemption_priority = 0;
+ info.info_type = RtecScheduler::OPERATION;
+ info.volatile_token = 0;
+}
+
+
+// Registers an RT_Info.
+
+int
+DynSched_Test::register_rt_info (ACE_DynScheduler &scheduler,
+ RtecScheduler::RT_Info &info)
+{
+ int result = 0;
+
+ if (scheduler.register_task (&info, info.handle) !=
+ ACE_DynScheduler::SUCCEEDED)
+ {
+ result = 1;
+ printf ("Could not register info for \"%s\"\n", info.entry_point.in ());
+ }
+
+ return result;
+}
+
+#if 0 /* not currently used */
+
+// Sets up a conjunction.
+
+void
+DynSched_Test::setup_conjunction (RtecScheduler::RT_Info &info,
+ const char *entry_point)
+{
+ // copy the passed entry point string into the RT_Info
+ info.entry_point = CORBA::string_dup (entry_point);
+
+ // initialize other values
+ info.handle = 0;
+ info.worst_case_execution_time = ORBSVCS_Time::zero ();
+ info.typical_execution_time = ORBSVCS_Time::zero ();
+ info.cached_execution_time = ORBSVCS_Time::zero ();
+ info.period = 0;
+ info.criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ info.importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ info.quantum = ORBSVCS_Time::zero ();
+ info.threads = 0;
+ info.priority = 0;
+ info.preemption_subpriority = 0;
+ info.preemption_priority = 0;
+ info.info_type = RtecScheduler::CONJUNCTION;
+ info.volatile_token = 0;
+}
+
+
+// Sets up a disjunction.
+
+void
+DynSched_Test::setup_disjunction (RtecScheduler::RT_Info &info,
+ const char *entry_point)
+{
+ // copy the passed entry point string into the RT_Info
+ info.entry_point = CORBA::string_dup (entry_point);
+
+ // initialize other values
+ info.handle = 0;
+ info.worst_case_execution_time = ORBSVCS_Time::zero ();
+ info.typical_execution_time = ORBSVCS_Time::zero ();
+ info.cached_execution_time = ORBSVCS_Time::zero ();
+ info.period = 0;
+ info.criticality = RtecScheduler::VERY_LOW_CRITICALITY;
+ info.importance = RtecScheduler::VERY_LOW_IMPORTANCE;
+ info.quantum = ORBSVCS_Time::zero ();
+ info.threads = 0;
+ info.priority = 0;
+ info.preemption_subpriority = 0;
+ info.preemption_priority = 0;
+ info.info_type = RtecScheduler::DISJUNCTION;
+ info.volatile_token = 0;
+}
+#endif /* not currently used */
+
+
+// Creates the schedule, runs timelines.
+
+int
+DynSched_Test::run_schedule (ACE_Scheduler_Strategy &strategy,
+ const char *output_filename,
+ const char *heading)
+{
+ RtecScheduler::RT_Info low_1, low_5, low_10, low_20;
+ RtecScheduler::RT_Info high_1, high_5, high_10, high_20;
+
+ ACE_Strategy_Scheduler scheduler (strategy);
+
+ DynSched_Test::setup_rt_info (low_1, "low_1", ONE_HZ, 180000,
+ RtecScheduler::LOW_CRITICALITY,
+ RtecScheduler::HIGH_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (low_5, "low_5", FIVE_HZ, 180000,
+ RtecScheduler::LOW_CRITICALITY,
+ RtecScheduler::HIGH_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (low_10, "low_10", TEN_HZ, 180000,
+ RtecScheduler::LOW_CRITICALITY,
+ RtecScheduler::HIGH_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (low_20, "low_20", TWENTY_HZ, 180000,
+ RtecScheduler::LOW_CRITICALITY,
+ RtecScheduler::HIGH_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (high_1, "high_1", ONE_HZ, 180000,
+ RtecScheduler::HIGH_CRITICALITY,
+ RtecScheduler::LOW_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (high_5, "high_5", FIVE_HZ, 180000,
+ RtecScheduler::HIGH_CRITICALITY,
+ RtecScheduler::LOW_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (high_10, "high_10", TEN_HZ, 180000,
+ RtecScheduler::HIGH_CRITICALITY,
+ RtecScheduler::LOW_IMPORTANCE, 1);
+ DynSched_Test::setup_rt_info (high_20, "high_20", TWENTY_HZ, 180000,
+ RtecScheduler::HIGH_CRITICALITY,
+ RtecScheduler::LOW_IMPORTANCE, 1);
+
+ if (
+ DynSched_Test::register_rt_info (scheduler, low_1) ||
+ DynSched_Test::register_rt_info (scheduler, low_5) ||
+ DynSched_Test::register_rt_info (scheduler, low_10) ||
+ DynSched_Test::register_rt_info (scheduler, low_20) ||
+ DynSched_Test::register_rt_info (scheduler, high_1) ||
+ DynSched_Test::register_rt_info (scheduler, high_5) ||
+ DynSched_Test::register_rt_info (scheduler, high_10) ||
+ DynSched_Test::register_rt_info (scheduler, high_20))
+ {
+ return -1;
+ }
+
+#if defined (ACE_HAS_QUANTIFY)
+ quantify_start_recording_data ();
+#endif /* ACE_HAS_QUANTIFY */
+
+ ACE_Unbounded_Set<RtecScheduler::Scheduling_Anomaly *> anomaly_set;
+ ACE_DynScheduler::status_t status = scheduler.schedule (anomaly_set);
+
+#if defined (ACE_HAS_QUANTIFY)
+ quantify_stop_recording_data ();
+#endif /* ACE_HAS_QUANTIFY */
+
+ switch (status)
+ {
+ case ACE_DynScheduler::SUCCEEDED:
+ case ACE_DynScheduler::ST_UTILIZATION_BOUND_EXCEEDED:
+
+ status = scheduler.output_timeline (output_filename, heading);
+ switch (status)
+ {
+ case ACE_DynScheduler::SUCCEEDED:
+ case ACE_DynScheduler::ST_UTILIZATION_BOUND_EXCEEDED:
+ break;
+
+ default :
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "scheduler.output_timeline (\"%s\") failed: "
+ "returned %d\n",
+ output_filename, status), -1);
+ }
+
+ break;
+
+ default :
+
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "scheduler.schedule () failed: "
+ "returned %d\n",
+ status), -1);
+ }
+
+ return 0;
+}
+
+int
+main (int, char *[])
+{
+ int result = 0;
+
+ // create a bunch of different strategies, indicating the minimum critical
+ // priority level (number of priority levels in critical set - 1) for each.
+
+ ACE_RMS_Scheduler_Strategy rms_strategy (3);
+
+ ACE_MLF_Scheduler_Strategy mlf_strategy (0);
+ ACE_EDF_Scheduler_Strategy edf_strategy (0);
+
+ ACE_MUF_Scheduler_Strategy muf_strategy (0);
+
+ result =
+ DynSched_Test::run_schedule (rms_strategy, "RMS_Timelines",
+ "RMS Scheduling Strategy");
+ if (result < 0)
+ {
+ printf ("run_schedule (rms_strategy, \"RMS_Timelines\", "
+ "\"RMS Scheduling Strategy\") returned %d\n",
+ result);
+ return 1;
+ }
+
+ result =
+ DynSched_Test::run_schedule (mlf_strategy, "MLF_Timelines",
+ "MLF Scheduling Strategy");
+ if (result < 0)
+ {
+ printf ("run_schedule (mlf_strategy, \"MLF_Timelines\", "
+ "\"MLF Scheduling Strategy\") returned %d\n",
+ result);
+ return 1;
+ }
+
+ result =
+ DynSched_Test::run_schedule (edf_strategy, "EDF_Timelines",
+ "EDF Scheduling Strategy");
+ if (result < 0)
+ {
+ printf ("run_schedule (edf_strategy, \"EDF_Timelines\", "
+ "\"EDF Scheduling Strategy\") returned %d\n",
+ result);
+ return 1;
+ }
+
+ result =
+ DynSched_Test::run_schedule (muf_strategy, "MUF_Timelines",
+ "MUF Scheduling Strategy");
+ if (result < 0)
+ {
+ printf ("run_schedule (muf_strategy, \"MUF_Timelines\", "
+ "\"MUF Scheduling Strategy\") returned %d\n",
+ result);
+ return 1;
+ }
+
+ return 0;
+}