summaryrefslogtreecommitdiff
path: root/trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl')
-rw-r--r--trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl496
1 files changed, 496 insertions, 0 deletions
diff --git a/trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl b/trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl
new file mode 100644
index 00000000000..374ef6c195b
--- /dev/null
+++ b/trunk/TAO/orbsvcs/orbsvcs/RtecScheduler.idl
@@ -0,0 +1,496 @@
+// $Id$
+
+#ifndef TAO_RTEC_SCHEDULER_IDL
+#define TAO_RTEC_SCHEDULER_IDL
+
+#include "TimeBase.idl"
+#include "RtecBase.idl"
+#pragma prefix ""
+
+module RtecScheduler
+{
+ // Module TimeBase defines the OMG Time Service.
+ typedef TimeBase::TimeT Time; // 100 nanoseconds
+ typedef Time Quantum_t;
+
+ typedef long Period_t; // 100 nanoseconds
+
+ typedef long Threads_t;
+
+ typedef sequence<Period_t> Period_Set;
+
+ enum Criticality_t
+ // Defines the criticality of the operation.
+ // For use with Dynamic Scheduler.
+ {
+ VERY_LOW_CRITICALITY,
+ LOW_CRITICALITY,
+ MEDIUM_CRITICALITY,
+ HIGH_CRITICALITY,
+ VERY_HIGH_CRITICALITY
+ };
+
+ enum Importance_t
+ // Defines the importance of the operation,
+ // which can be used by the Scheduler as a
+ // "tie-breaker" when other scheduling
+ // parameters are equal.
+ {
+ VERY_LOW_IMPORTANCE,
+ LOW_IMPORTANCE,
+ MEDIUM_IMPORTANCE,
+ HIGH_IMPORTANCE,
+ VERY_HIGH_IMPORTANCE
+ };
+
+ enum Info_Type_t
+ // Defines type of operation information.
+ {
+ OPERATION,
+ CONJUNCTION,
+ DISJUNCTION,
+ REMOTE_DEPENDANT
+ };
+
+ typedef RtecBase::Dependency_Enabled_Type_t Dependency_Enabled_Type_t;
+ typedef RtecBase::Dependency_Type_t Dependency_Type_t;
+
+ enum RT_Info_Enabled_Type_t
+ // Specify whether an RT_Info is enabled, disabled, or
+ // non-volatile (enabled + cannot be disabled automatically).
+ {
+ RT_INFO_DISABLED,
+ RT_INFO_ENABLED,
+ RT_INFO_NON_VOLATILE
+ };
+
+ typedef RtecBase::handle_t handle_t;
+ // RT_Info's are assigned per-application
+ // unique identifiers.
+
+ struct RT_Info_Enable_State_Pair
+ {
+ handle_t handle;
+ RT_Info_Enabled_Type_t enabled;
+ };
+
+ typedef sequence<RT_Info_Enable_State_Pair> RT_Info_Enable_State_Pair_Set;
+
+ typedef RtecBase::Dependency_Info Dependency_Info;
+
+ typedef sequence<Dependency_Info> Dependency_Set;
+
+ typedef RtecBase::OS_Priority OS_Priority;
+ typedef RtecBase::Preemption_Subpriority_t Preemption_Subpriority_t;
+ typedef RtecBase::Preemption_Priority_t Preemption_Priority_t;
+
+ struct RT_Info
+ // = TITLE
+ // Describes the QoS for an "RT_Operation".
+ //
+ // = DESCRIPTION
+ // The CPU requirements and QoS for each
+ // "entity" implementing an application
+ // operation is described by the following
+ // information.
+ {
+ // Application-defined string that uniquely
+ // identifies the operation.
+ string entry_point;
+
+ // The scheduler-defined unique identifier.
+ handle_t handle;
+
+ // Execution times.
+ Time worst_case_execution_time;
+ Time typical_execution_time;
+
+ // To account for server data caching.
+ Time cached_execution_time;
+
+ // For rate-base operations, this expresses
+ // the rate. 0 means "completely pasive",
+ // i.e., this operation only executes when
+ // called.
+ Period_t period;
+
+ // Operation Criticality (user assigned significance).
+ Criticality_t criticality;
+
+ // Operation importance, used to "break ties".
+ Importance_t importance;
+
+ // For time-slicing (for BACKGROUND operations only).
+ Quantum_t quantum;
+
+ // The number of internal threads contained by
+ // the operation.
+ Threads_t threads;
+
+ // The following attributes are defined by
+ // the Scheduler once the off-line schedule
+ // is computed.
+
+ // The operations we depend upon.
+ Dependency_Set dependencies;
+
+ // The OS thread priority for processing the
+ // events generated from this RT_Info.=
+ OS_Priority priority;
+
+ // For ordering RT_Info's with equal priority.
+ Preemption_Subpriority_t preemption_subpriority;
+
+ // The queue number for this RT_Info.
+ Preemption_Priority_t preemption_priority;
+
+ // Info_Type
+ Info_Type_t info_type;
+ // Whether or not the RT_Info is enabled.
+ RT_Info_Enabled_Type_t enabled;
+
+ // Token reserved for the scheduler's internal use:
+ // information placed here from outside the scheduler
+ // implementation is prone to be overwritten.
+ unsigned long long volatile_token;
+ };
+
+ enum Dispatching_Type_t
+ // Defines the type of prioritization strategy
+ // to be used by a dispatching queue
+ {
+ STATIC_DISPATCHING,
+ DEADLINE_DISPATCHING,
+ LAXITY_DISPATCHING
+ };
+
+ struct Config_Info
+ // = TITLE
+ // Describes configuration information for a dispatching queue
+ //
+ // = DESCRIPTION
+ // The CPU requirements and QoS for each
+ // "entity" implementing an application
+ // operation is described by the following
+ // information.
+ {
+ // preemption priority for messages dispatched by the queue
+ Preemption_Priority_t preemption_priority;
+
+ // OS priority of the dispatching thread associated with the queue
+ OS_Priority thread_priority;
+
+ // type of dispatching queue
+ Dispatching_Type_t dispatching_type;
+
+ // Set of timer periods associated with the priority level
+ Period_Set timer_periods;
+ };
+
+ typedef sequence<Config_Info> Config_Info_Set;
+
+ enum Anomaly_Severity
+ // Defines the type of prioritization strategy
+ // to be used by a dispatching queue
+ {
+ ANOMALY_FATAL,
+ ANOMALY_ERROR,
+ ANOMALY_WARNING,
+ ANOMALY_NONE
+ };
+
+ struct Scheduling_Anomaly
+ // = TITLE
+ // Describes an anomalous condition encountered during scheduling.
+ //
+ // = DESCRIPTION
+ // The severity and description of an anomolous
+ // condition encountered during schedule computation
+ // is described by the following information.
+ {
+ // Application-defined string that describes
+ // the anomalous condition.
+ string description;
+
+ // Severity of the anomaly
+ Anomaly_Severity severity;
+ };
+
+ typedef sequence<Scheduling_Anomaly> Scheduling_Anomaly_Set;
+
+ exception CYCLIC_DEPENDENCIES {};
+ // There are cycles in the registered dependencies.
+
+ exception UNRESOLVED_LOCAL_DEPENDENCIES {};
+ // There are unresolved local dependencies: one
+ // or more nodes that are not declared as having
+ // unresolved remote dependencies has no threads,
+ // period, or dependencies on another node.
+
+ exception THREAD_SPECIFICATION {};
+ // A node that specifies threads does not specify a period.
+
+ exception DUPLICATE_NAME {};
+ // The application is trying to register the same task again.
+
+ exception UNKNOWN_TASK {};
+ // The RT_Info handle was not valid.
+
+ exception NOT_SCHEDULED {};
+ // The application is trying to obtain scheduling information, but
+ // none is available.
+
+ exception UTILIZATION_BOUND_EXCEEDED {};
+ exception INSUFFICIENT_THREAD_PRIORITY_LEVELS {};
+ exception TASK_COUNT_MISMATCH {};
+ // Problems while computing scheduling.
+
+ exception UNKNOWN_PRIORITY_LEVEL {};
+ // Problems obtaining run-time dispatch queue info.
+
+ exception SYNCHRONIZATION_FAILURE {};
+ // Problems acquiring a synchronization resource.
+
+ exception INTERNAL {};
+ // Problems with the internal scheduler data structures.
+
+ typedef sequence<RT_Info> RT_Info_Set;
+
+ // TODO: Find a reasonable name for this interface, maybe we should
+ // change the name of the module to RtecSchedulerAdmin and name this
+ // Scheduler
+ interface Scheduler
+ // = DESCRIPTION
+ // This class holds all the RT_Info's for a single application.
+ // During the configuration run this will be implemented as a
+ // single remote object, whose services are used by the
+ // suppliers, consumers and the EC.
+ // At run-time each process will hold a copy of the compiled
+ // version of the Scheduler, using the precomputed data to
+ // resolve requests (avoiding any remote calls) and ignoring any
+ // requests for modifying its state.
+ // A Factory class will be used to choose the proper
+ // implementation.
+ //
+ // This class must be registered with the naming service using a
+ // well known name ("Scheduler" seems the obvious choice), the
+ // Naming Context will account for different applications and
+ // modes.
+ //
+ // Once the scheduling data is computed it can be retrieved
+ // remotely to generate the code for the run-time version.
+ {
+ handle_t create (in string entry_point)
+ raises (DUPLICATE_NAME, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Creates a new RT_Info entry for the function identifier
+ // "entry_point", it can be any string, but the fully qualified
+ // name function name is suggested.
+ // Returns a handle to the RT_Info.
+
+ handle_t lookup (in string entry_point)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE);
+ // Lookups a handle for entry_point.
+
+ RT_Info get (in handle_t handle)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE);
+ // Retrieve information about an RT_Info.
+
+ void set (in handle_t handle,
+ in Criticality_t criticality,
+ in Time wc_time,
+ in Time typical_time,
+ in Time cached_time,
+ in Period_t period,
+ in Importance_t importance,
+ in Quantum_t quantum,
+ in Threads_t threads,
+ in Info_Type_t info_type)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Set the input attributes of an RT_Info. Multiple calls
+ // to set with the same handle will result in registration
+ // of different tuples for the same RT_Info, e.g., for multi-rate
+ // admission control.
+ // Notice that some values may not be modified (like priority).
+ // Criticality and Info_Type are only used with the Dynamic Scheduler.
+
+ void reset (in handle_t handle,
+ in Criticality_t criticality,
+ in Time wc_time,
+ in Time typical_time,
+ in Time cached_time,
+ in Period_t period,
+ in Importance_t importance,
+ in Quantum_t quantum,
+ in Threads_t threads,
+ in Info_Type_t info_type)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Removes previous tuples and resets the attributes of an RT_Info.
+ // Notice that some values may not be modified (like priority).
+ // Criticality and Info_Type are only used with the Dynamic Scheduler.
+
+
+ void set_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Set the input attributes of an RT_Info. Tuples for the passed
+ // sequence elements will be concatenated with the previous
+ // tuples for the same RT_Infos, e.g., for multi-rate admission control.
+ // Notice that some values may not be modified (like priority).
+
+ void reset_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Reset the input attributes of an RT_Info. Tuples for the passed
+ // sequence elements will be replace the previous
+ // tuples for the same RT_Infos, e.g., for multi-rate admission control.
+ // Notice that some values may not be modified (like priority).
+
+ void replace_seq (in RT_Info_Set infos)
+ raises (UNKNOWN_TASK, INTERNAL, SYNCHRONIZATION_FAILURE);
+ // Replace all RT_Infos, setting characteristics of the RT_Infos
+ // corresponding to the passed handles. All other RT_Infos are reset
+ // to their uninitialized values, i.e., the same they have just after
+ // the create call.
+
+ void add_dependency (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Adds <dependency> to <handle>.
+ // Dependency_Type_t is only used with the Dynamic Scheduler.
+
+ void remove_dependency (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Removes <dependency> from <handle>. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void set_dependency_enable_state (in handle_t handle,
+ in handle_t dependency,
+ in long number_of_calls,
+ in Dependency_Type_t dependency_type,
+ in Dependency_Enabled_Type_t enabled)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Enables or disables <dependency> on <handle>. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void set_dependency_enable_state_seq (in Dependency_Set dependencies)
+ raises (SYNCHRONIZATION_FAILURE, UNKNOWN_TASK);
+ // Sets the enable state of each dependency in the sequence. Raises
+ // UNKNOWN_TASK if no matching dependency is found.
+
+ void set_rt_info_enable_state (in handle_t handle,
+ in RT_Info_Enabled_Type_t enabled)
+ raises (SYNCHRONIZATION_FAILURE, INTERNAL, UNKNOWN_TASK);
+ // Enables or disables the RT_Info. Raises UNKNOWN_TASK
+ // if no matching RT_Info is found.
+
+ void set_rt_info_enable_state_seq (in RT_Info_Enable_State_Pair_Set pair_set)
+ raises (SYNCHRONIZATION_FAILURE, INTERNAL, UNKNOWN_TASK);
+ // Enables or disables each rt_info in the passed set. Raises UNKNOWN_TASK
+ // if no matching dependency is found.
+
+ void priority (in handle_t handle,
+ out OS_Priority o_priority,
+ out Preemption_Subpriority_t p_subpriority,
+ out Preemption_Priority_t p_priority)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ void entry_point_priority (in string entry_point,
+ out OS_Priority o_priority,
+ out Preemption_Subpriority_t p_subpriority,
+ out Preemption_Priority_t p_priority)
+ raises (UNKNOWN_TASK, SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Obtain the run time priorities.
+ // TODO: Do we need the two interfaces or is it simply confusing?
+ // If we should to keep only the <handle> version: Are the extra
+ // round-trips too expensive?
+ // If we choose only the <entry_point> version: Are the copies for
+ // the string affordable?
+
+ void compute_scheduling (in long minimum_priority,
+ in long maximum_priority,
+ out RT_Info_Set infos,
+ out Dependency_Set dependencies,
+ out Config_Info_Set configs,
+ out Scheduling_Anomaly_Set anomalies)
+ raises (UTILIZATION_BOUND_EXCEEDED,
+ SYNCHRONIZATION_FAILURE,
+ INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ TASK_COUNT_MISMATCH,
+ INTERNAL,
+ DUPLICATE_NAME);
+ // Computes the scheduling priorities, returns the RT_Info's with
+ // their priorities properly filled.
+ // This info can be cached by a Run_Time_Scheduler service or
+ // dumped into a C++ file for compilation and even faster (static)
+ // lookup.
+
+
+ void recompute_scheduling (in long minimum_priority,
+ in long maximum_priority,
+ out Scheduling_Anomaly_Set anomalies)
+ raises (UTILIZATION_BOUND_EXCEEDED,
+ SYNCHRONIZATION_FAILURE,
+ INSUFFICIENT_THREAD_PRIORITY_LEVELS,
+ TASK_COUNT_MISMATCH,
+ INTERNAL,
+ DUPLICATE_NAME);
+ // Recomputes the scheduling priorities, etc.
+
+ void get_rt_info_set (out RT_Info_Set infos)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ void get_dependency_set (out Dependency_Set dependencies)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of rt_infos, with their assigned priorities (as
+ // of the last schedule re-computation).
+
+ void get_config_info_set (out Config_Info_Set configs)
+ raises (SYNCHRONIZATION_FAILURE,
+ INTERNAL);
+ // Returns the set of config_infos, describing the appropriate
+ // number, types, and priority levels for the dispatching lanes.
+
+ void dispatch_configuration (in Preemption_Priority_t p_priority,
+ out OS_Priority o_priority,
+ out Dispatching_Type_t d_type)
+ raises (NOT_SCHEDULED,
+ SYNCHRONIZATION_FAILURE,
+ UNKNOWN_PRIORITY_LEVEL);
+ // Returns the thread priority and dispatching type assigned
+ // to the dispatching priority level that was passed in. This
+ // information can be used to configure the queues through which
+ // the scheduled operations are to be dispatched.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+ //
+ // If the schedule has been computed, but the passed
+ // priority level is outside those assigned:
+ // raises (UNKNOWN_PRIORITY_LEVEL);
+
+
+ Preemption_Priority_t last_scheduled_priority ()
+ raises (SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Returns the last priority number assigned to an operation in the schedule.
+ // The number returned is one less than the total number of scheduled priorities.
+ // All scheduled priorities range from 0 to the number returned, inclusive.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+
+ void get_config_infos(out Config_Info_Set configs)
+ raises (SYNCHRONIZATION_FAILURE, NOT_SCHEDULED);
+ // Provides the set of Config_Infos associated with the current schedule.
+ //
+ // If the schedule has not been computed:
+ // raises (NOT_SCHEDULED);
+ };
+};
+
+#endif /* TAO_RTEC_SCHEDULER_IDL */