summaryrefslogtreecommitdiff
path: root/TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp')
-rw-r--r--TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp452
1 files changed, 452 insertions, 0 deletions
diff --git a/TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp b/TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp
new file mode 100644
index 00000000000..a856587a8f7
--- /dev/null
+++ b/TAO/orbsvcs/tests/Sched_Conf/Sched_Conf.cpp
@@ -0,0 +1,452 @@
+// $Id$
+
+// This program performa a simple scheduler configuration run,
+// and dumps the results of one scheduling into a C++ header file.
+
+#include "ace/Sched_Params.h"
+#include "ace/Get_Opt.h"
+
+#include "orbsvcs/CosNamingC.h"
+#include "orbsvcs/Scheduler_Factory.h"
+#include "orbsvcs/Naming/Naming_Client.h"
+#include "orbsvcs/Naming/Naming_Server.h"
+
+ACE_RCSID (Sched_Conf,
+ Sched_Conf,
+ "$Id$")
+
+const char* service_name = "ScheduleService";
+
+const char* format_string = " {%-12s, %d, %d, %d, %d, %8d, "
+ " static_cast<RtecScheduler::Criticality_t> (%d), "
+ " static_cast<RtecScheduler::Importance_t> (%d), "
+ " %d, %d, %3d, %d, %d, "
+ "static_cast<RtecScheduler::Info_Type_t> (%d)}\n";
+
+int
+parse_args (int argc, char *argv [])
+{
+ ACE_Get_Opt get_opt (argc, argv, "n:");
+ int opt;
+
+ while ((opt = get_opt ()) != EOF)
+ {
+ switch (opt)
+ {
+ case 'n':
+ service_name = get_opt.opt_arg ();
+ break;
+ case '?':
+ default:
+ ACE_DEBUG ((LM_DEBUG,
+ "Usage: %s "
+ "-n service_name "
+ "\n",
+ argv[0]));
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int
+main (int argc, char *argv[])
+{
+ if (parse_args (argc, argv) != 0)
+ {
+ return 1;
+ }
+
+ // create initial data for supplier and consumer operations
+ const int operation_count = 16;
+ ACE_Scheduler_Factory::POD_RT_Info config_infos[operation_count] = {
+ // 20 Hz high criticality supplier
+ { "high_20_S", // entry point
+ 0, // handle
+ 5000, // worst case execution time
+ 5000, // typical execution time (unused)
+ 5000, // cached execution time
+ 500000, // period (100 ns)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 20 Hz low criticality supplier
+ { "low_20_S", // entry point
+ 0, // handle
+ 5000, // worst case execution time
+ 5000, // typical execution time (unused)
+ 5000, // cached execution time
+ 500000, // period (100 ns)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 10 Hz high criticality supplier
+ { "high_10_S", // entry point
+ 0, // handle
+ 10000, // worst case execution time
+ 10000, // typical execution time (unused)
+ 10000, // cached execution time
+ 1000000, // period (100 ns)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 10 Hz low criticality supplier
+ { "low_10_S", // entry point
+ 0, // handle
+ 10000, // worst case execution time
+ 10000, // typical execution time (unused)
+ 10000, // cached execution time
+ 1000000, // period (100 ns)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 5 Hz high criticality supplier
+ { "high_05_S", // entry point
+ 0, // handle
+ 20000, // worst case execution time
+ 20000, // typical execution time (unused)
+ 20000, // cached execution time
+ 2000000, // period (100 ns)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 5 Hz low criticality supplier
+ { "low_05_S", // entry point
+ 0, // handle
+ 20000, // worst case execution time
+ 20000, // typical execution time (unused)
+ 20000, // cached execution time
+ 2000000, // period (100 ns)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 1, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler:: RT_INFO_ENABLED
+ },
+ // 1 Hz high criticality supplier (declares a rate but no threads)
+ { "high_01_S", // entry point
+ 0, // handle
+ 100000, // worst case execution time
+ 100000, // typical execution time (unused)
+ 100000, // cached execution time
+ 10000000, // period (100 ns)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 1 Hz low criticality supplier (remote dependant: scheduler should warn)
+ { "low_01_S", // entry point
+ 0, // handle
+ 100000, // worst case execution time
+ 100000, // typical execution time (unused)
+ 100000, // cached execution time
+ 10000000, // period (100 ns)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 20 Hz high criticality consumer
+ { "high_20_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 20 Hz low criticality consumer
+ { "low_20_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 10 Hz high criticality consumer
+ { "high_10_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 10 Hz low criticality consumer
+ { "low_10_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 5 Hz high criticality consumer
+ { "high_05_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 5 Hz low criticality consumer
+ { "low_05_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 1 Hz high criticality consumer
+ { "high_01_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::HIGH_CRITICALITY, // criticality
+ RtecScheduler::LOW_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ },
+ // 1 Hz low criticality consumer
+ { "low_01_C", // entry point
+ 0, // handle
+ 0, // worst case execution time
+ 0, // typical execution time (unused)
+ 0, // cached execution time
+ 0, // period (zero)
+ RtecScheduler::LOW_CRITICALITY, // criticality
+ RtecScheduler::HIGH_IMPORTANCE, // importance
+ 0, // quantum (unused)
+ 0, // threads
+ 0, // OS priority
+ 0, // Preemption subpriority
+ 0, // Preemption priority
+ RtecScheduler::OPERATION, // info type
+ RtecScheduler::RT_INFO_ENABLED
+ }
+ };
+
+
+ ACE_TRY_NEW_ENV
+ {
+ // Initialize ORB.
+ CORBA::ORB_var orb =
+ CORBA::ORB_init (argc, argv, "internet" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ CORBA::Object_var poa_object =
+ orb->resolve_initial_references("RootPOA" ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ if (CORBA::is_nil(poa_object.in ()))
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to initialize the POA.\n"),
+ 1);
+
+ PortableServer::POA_var root_poa =
+ PortableServer::POA::_narrow (poa_object.in() ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ PortableServer::POAManager_var poa_manager =
+ root_poa->the_POAManager (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ poa_manager->activate (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // Initialize the naming services
+ TAO_Naming_Client my_name_client;
+ if (my_name_client.init (orb.in ()) != 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to initialize "
+ "the TAO_Naming_Client. \n"),
+ -1);
+
+ CosNaming::NamingContext_var context =
+ my_name_client.get_context ();
+
+ if (ACE_Scheduler_Factory::use_config (context.in (),
+ service_name) < 0)
+ ACE_ERROR_RETURN ((LM_ERROR,
+ " (%P|%t) Unable to bind to the scheduling service.\n"),
+ 1);
+
+ // Create and initialize RT_Infos in the scheduler, make second
+ // half of array depend on first half.
+ for (int i = 0; i < operation_count; ++i)
+ {
+ // create the RT_Info
+ config_infos[i].handle =
+ ACE_Scheduler_Factory::server ()->create (config_infos[i].entry_point
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // initialize the RT_Info
+ ACE_Scheduler_Factory::server ()->
+ set (config_infos[i].handle,
+ static_cast<RtecScheduler::Criticality_t> (config_infos[i].criticality),
+ config_infos[i].worst_case_execution_time,
+ config_infos[i].typical_execution_time,
+ config_infos[i].cached_execution_time,
+ config_infos[i].period,
+ static_cast<RtecScheduler::Importance_t> (config_infos[i].importance),
+ config_infos[i].quantum,
+ config_infos[i].threads,
+ static_cast<RtecScheduler::Info_Type_t> (config_infos[i].info_type)
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+
+ // make operations in second half dependant on
+ // operations in the first half of the array,
+ // and have each called twice as a oneway call
+ if (i >= (operation_count / 2))
+ {
+ ACE_Scheduler_Factory::server ()->
+ add_dependency (config_infos[i].handle,
+ config_infos[i - (operation_count / 2)].handle,
+ 2, // number of calls
+ RtecBase::ONE_WAY_CALL // type of dependency
+ ACE_ENV_ARG_PARAMETER);
+ ACE_TRY_CHECK;
+ }
+ }
+
+ RtecScheduler::RT_Info_Set_var infos;
+ RtecScheduler::Dependency_Set_var deps;
+ RtecScheduler::Config_Info_Set_var configs;
+ RtecScheduler::Scheduling_Anomaly_Set_var anomalies;
+
+ ACE_Scheduler_Factory::server ()->compute_scheduling
+ (ACE_Sched_Params::priority_min (ACE_SCHED_FIFO,
+ ACE_SCOPE_THREAD),
+ ACE_Sched_Params::priority_max (ACE_SCHED_FIFO,
+ ACE_SCOPE_THREAD),
+ infos.out (), deps.out (), configs.out (), anomalies.out ()
+ ACE_ENV_ARG_PARAMETER);
+
+ ACE_TRY_CHECK;
+
+ ACE_Scheduler_Factory::dump_schedule (infos.in (),
+ deps.in (),
+ configs.in (),
+ anomalies.in (),
+ "Sched_Conf_Runtime.h",
+ format_string);
+ }
+ ACE_CATCHANY
+ {
+ ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "SYS_EX");
+ }
+ ACE_ENDTRY;
+
+ return 0;
+}