diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h | 339 |
1 files changed, 310 insertions, 29 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h index a9fd17ab431..d2fe751d304 100644 --- a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h +++ b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Scheduler_T.h @@ -46,14 +46,14 @@ class TAO_Reconfig_Scheduler : public: typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t, - RtecScheduler::RT_Info*, + TAO_RT_Info_Ex *, ACE_Hash<RtecScheduler::handle_t>, ACE_Equal_To<RtecScheduler::handle_t>, ACE_LOCK> RT_INFO_MAP; // Type of map used for O(1) lookup of RT_Infos by their handles. typedef ACE_RB_Tree<const char *, - RtecScheduler::RT_Info*, + TAO_RT_Info_Ex*, ACE_Less_Than<const char *>, ACE_LOCK> RT_INFO_TREE; // Type of tree used for O(log n) lookup of RT_Infos by their names. @@ -73,7 +73,13 @@ public: // Type of map used for O(1) lookup of RT_Info // dependency sets by caller or called handle. - TAO_Reconfig_Scheduler (int enforce_schedule_stability = 0); + typedef typename DEPENDENCY_SET_MAP::ITERATOR DEPENDENCY_SET_MAP_ITERATOR; + // Type of iterator for traversal of RT_Info dependency sets by + // caller or called handle. + + TAO_Reconfig_Scheduler (int enforce_schedule_stability = 0, + const CORBA::Double & critical_utilization_threshold = 1.0, + const CORBA::Double & noncritical_utilization_threshold = 1.1); // Default constructor. TAO_Reconfig_Scheduler (int config_count, @@ -83,10 +89,15 @@ public: int dependency_count, ACE_Scheduler_Factory::POD_Dependency_Info dependency_info[], u_long stability_flags, - int enforce_schedule_stability = 0); + int enforce_schedule_stability = 0, + const CORBA::Double & critical_utilization_threshold = 1.0, + const CORBA::Double & noncritical_utilization_threshold = 1.1); // Constructor. Initialize the scheduler from POD_Config_Info, POD_RT_Info, // and POD_Dependency arrays, plus schedule stability flags. + ~TAO_Reconfig_Scheduler (); + // Destructor. + int init (int config_count, ACE_Scheduler_Factory::POD_Config_Info config_info[], int rt_info_count, @@ -104,6 +115,7 @@ public: void close (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL, RtecScheduler::UNKNOWN_TASK, RtecScheduler::SYNCHRONIZATION_FAILURE)); // Closes the scheduler, releasing all current resources. @@ -151,6 +163,52 @@ public: RtecScheduler::SYNCHRONIZATION_FAILURE)); // Set characteristics of the RT_Info corresponding to the passed handle. + virtual void reset (RtecScheduler::handle_t handle, + RtecScheduler::Criticality_t criticality, + RtecScheduler::Time time, + RtecScheduler::Time typical_time, + RtecScheduler::Time cached_time, + RtecScheduler::Period_t period, + RtecScheduler::Importance_t importance, + RtecScheduler::Quantum_t quantum, + CORBA::Long threads, + RtecScheduler::Info_Type_t info_type + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::UNKNOWN_TASK, + RtecScheduler::INTERNAL, + RtecScheduler::SYNCHRONIZATION_FAILURE)); + // Reset characteristics of the RT_Info corresponding to the passed handle. + + virtual void set_seq (const RtecScheduler::RT_Info_Set& infos + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::UNKNOWN_TASK, + RtecScheduler::INTERNAL, + RtecScheduler::SYNCHRONIZATION_FAILURE)); + // Set characteristics of the RT_Infos corresponding to the passed handles. + // Tuples are added in the case of existing and/or multiple definitions. + + virtual void reset_seq (const RtecScheduler::RT_Info_Set& infos + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::UNKNOWN_TASK, + RtecScheduler::INTERNAL, + RtecScheduler::SYNCHRONIZATION_FAILURE)); + // Reset characteristics of the RT_Infos corresponding to the passed handles. + // Tuples are replaced in the case of existing and/or multiple definitions. + + virtual void replace_seq (const RtecScheduler::RT_Info_Set& infos + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::UNKNOWN_TASK, + RtecScheduler::INTERNAL, + RtecScheduler::SYNCHRONIZATION_FAILURE)); + // Replace all RT_Infos, resetting 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. + virtual void priority (RtecScheduler::handle_t handle, RtecScheduler::OS_Priority& o_priority, RtecScheduler::Preemption_Subpriority_t& p_subpriority, @@ -185,9 +243,53 @@ public: RtecScheduler::UNKNOWN_TASK)); // This method registers a dependency between two RT_Infos. + virtual void remove_dependency (RtecScheduler::handle_t handle, + RtecScheduler::handle_t dependency, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // This method removes a dependency between two RT_Infos. + + virtual void set_dependency_enable_state (RtecScheduler::handle_t handle, + RtecScheduler::handle_t dependency, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type, + RtecScheduler::Dependency_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // This method sets the enable state of a dependency between two RT_Infos. + + virtual void set_dependency_enable_state_seq (const RtecScheduler::Dependency_Set & dependencies + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // This method sets the enable state of a sequence of dependencies. + + virtual void set_rt_info_enable_state (RtecScheduler::handle_t handle, + RtecScheduler::RT_Info_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // This method enables or disables an RT_Info. + + virtual void set_rt_info_enable_state_seq (const RtecScheduler::RT_Info_Enable_State_Pair_Set & pair_set + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // This method enables or disables a sequence of RT_Infos. + virtual void compute_scheduling (CORBA::Long minimum_priority, CORBA::Long maximum_priority, RtecScheduler::RT_Info_Set_out infos, + RtecScheduler::Dependency_Set_out dependencies, RtecScheduler::Config_Info_Set_out configs, RtecScheduler::Scheduling_Anomaly_Set_out anomalies ACE_ENV_ARG_DECL) @@ -203,6 +305,44 @@ public: // to be computed for all registered RT_Infos. If the schedule is // already stable, this is a no-op. + virtual void recompute_scheduling (CORBA::Long minimum_priority, + CORBA::Long maximum_priority, + RtecScheduler::Scheduling_Anomaly_Set_out anomalies + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::UTILIZATION_BOUND_EXCEEDED, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::INSUFFICIENT_THREAD_PRIORITY_LEVELS, + RtecScheduler::TASK_COUNT_MISMATCH, + RtecScheduler::INTERNAL, + RtecScheduler::DUPLICATE_NAME)); + // Recomputes the scheduling priorities, etc. + + virtual void get_rt_info_set (RtecScheduler::RT_Info_Set_out infos + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::INTERNAL)); + // Returns the set of rt_infos, with their assigned priorities (as + // of the last schedule re-computation). + + virtual void get_dependency_set (RtecScheduler::Dependency_Set_out dependencies + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::INTERNAL)); + // Returns the set of rt_infos, with their assigned priorities (as + // of the last schedule re-computation). + + virtual void get_config_info_set (RtecScheduler::Config_Info_Set_out configs + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::INTERNAL)); + // Returns the set of config_infos, describing the appropriate + // number, types, and priority levels for the dispatching lanes. + + virtual void dispatch_configuration (RtecScheduler::Preemption_Priority_t p_priority, RtecScheduler::OS_Priority& o_priority, RtecScheduler::Dispatching_Type_t & d_type @@ -247,6 +387,9 @@ public: long rt_info_count (); // Returns the number of registered RT_Infos. + long rt_info_tuple_count (); + // Returns the number of registered RT_Info tuples. + RT_INFO_TREE & rt_info_tree (); // Accesses tree for O(log n) lookup of RT_Infos by name. @@ -262,11 +405,33 @@ public: // Returns the number of dependencies in the dependency lists of all RT_Infos. // This is used when traversing the dependency graph. + CORBA::Double noncritical_utilization (); + // Accessor for utilization by noncritical tasks. + + CORBA::Double critical_utilization (); + // Accessor for utilization by critical tasks. + + CORBA::Double noncritical_utilization_threshold (); + // Accessor for noncritical task utilization threshold. + + void noncritical_utilization_threshold (const CORBA::Double &); + // Mutator for noncritical task utilization threshold. + + CORBA::Double critical_utilization_threshold (); + // Accessor for critical task utilization threshold. + + void critical_utilization_threshold (const CORBA::Double &); + // Mutator for critical task utilization threshold. + protected: // @@ TO DO: use a memento to save and restore scheduler state without // breaking encapsulation, particularly of these flags. + // @@ TO DO: Recheck the applicability and fine-grain management of + // these flags. Do these still correctly reflect the phases + // of the computation? + enum Stability_Flags { // This should always be zero. @@ -293,18 +458,20 @@ protected: }; // Flags indicating stability conditions of schedule. - virtual RtecScheduler::RT_Info * create_i (const char * entry_point, - RtecScheduler::handle_t handle - ACE_ENV_ARG_DECL) + TAO_RT_Info_Ex * create_i (const char * entry_point, + RtecScheduler::handle_t handle, + int ignore_duplicates + ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::DUPLICATE_NAME, RtecScheduler::INTERNAL)); - // Internal method to create an RT_Info. If it does not exist, - // a new RT_Info is created and inserted into the schedule, - // and the handle of the new RT_Info is returned. - // If the RT_Info already exists, an exception is thrown. + // Internal method to create an RT_Info. If it does not exist, a + // new RT_Info is created and inserted into the schedule, and the + // handle of the new RT_Info is returned. If the RT_Info already + // exists, then if the ignore_duplicates flag is set, the handle + // is simply returned; otherwise, an exception is thrown. - virtual void set_i (RtecScheduler::RT_Info *rt_info, + void set_i (TAO_RT_Info_Ex *rt_info, RtecScheduler::Criticality_t criticality, RtecScheduler::Time time, RtecScheduler::Time typical_time, @@ -313,7 +480,10 @@ protected: RtecScheduler::Importance_t importance, RtecScheduler::Quantum_t quantum, CORBA::Long threads, - RtecScheduler::Info_Type_t info_type); + RtecScheduler::Info_Type_t info_type + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL)); // Internal method to set characteristics of the passed RT_Info. virtual RtecScheduler::handle_t lookup_i (const char * entry_point @@ -337,8 +507,9 @@ protected: virtual void add_dependency_i (RtecScheduler::handle_t handle, RtecScheduler::handle_t dependency, CORBA::Long number_of_calls, - RtecScheduler::Dependency_Type_t dependency_type - ACE_ENV_ARG_DECL) + RtecScheduler::Dependency_Type_t dependency_type, + RtecScheduler::Dependency_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::INTERNAL, RtecScheduler::UNKNOWN_TASK)); @@ -346,21 +517,68 @@ protected: // Assumes it is being called with all locks held, and does *not* // set any schedule stability flags. + virtual void remove_dependency_i (RtecScheduler::handle_t handle, + RtecScheduler::handle_t dependency, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // Internal method that removes a dependency between two RT_Infos. + // Assumes it is being called with all locks held, and does *not* + // set any schedule stability flags. + + virtual void set_dependency_enable_state_i (RtecScheduler::handle_t handle, + RtecScheduler::handle_t dependency, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type, + RtecScheduler::Dependency_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::SYNCHRONIZATION_FAILURE, + RtecScheduler::UNKNOWN_TASK)); + // Internal method that enables or disables a dependency between two RT_Infos. + // Assumes it is being called with all locks held, and does *not* + // set any schedule stability flags. + + virtual void map_dependency_i (RtecScheduler::handle_t key, RtecScheduler::handle_t handle, - ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t, - RtecScheduler::Dependency_Set*, - ACE_Hash<RtecScheduler::handle_t>, - ACE_Equal_To<RtecScheduler::handle_t>, - ACE_LOCK> &map, + ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map, CORBA::Long number_of_calls, - RtecScheduler::Dependency_Type_t dependency_type - ACE_ENV_ARG_DECL) + RtecScheduler::Dependency_Type_t dependency_type, + RtecScheduler::Dependency_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL, RtecScheduler::UNKNOWN_TASK)); // This method installs a dependency in a dependency set map. + void unmap_dependency_i (RtecScheduler::handle_t key, + RtecScheduler::handle_t handle, + ACE_TYPENAME TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL, + RtecScheduler::UNKNOWN_TASK)); + // This method removes a dependency from a dependency set map. + + void map_dependency_enable_state_i (RtecScheduler::handle_t key, + RtecScheduler::handle_t handle, + ACE_TYPENAME + TAO_Reconfig_Scheduler<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP &dependency_map, + CORBA::Long number_of_calls, + RtecScheduler::Dependency_Type_t dependency_type, + RtecScheduler::Dependency_Enabled_Type_t enabled + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL, + RtecScheduler::UNKNOWN_TASK)); + // This method updates the enable state of a dependency in a dependency set map. virtual void dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, @@ -375,7 +593,28 @@ protected: // Sorts an array of RT_info handles in topological order, then // checks for loops, marks unresolved remote dependencies. - virtual void propagate_characteristics_i (ACE_ENV_SINGLE_ARG_DECL) + void perform_admission_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL)); + // Compute aggregate execution times, then performs admission over + // rate tuples. + + + void crit_dfs_traverse_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL)); + // Traverses criticality dependency graph, assigning a topological + // ordering. Resets DFS map entries, do DFS traversal, constructs + // DFS map. + + + void propagate_criticalities_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL)); + // Propagates criticalities. + + + void propagate_characteristics_i (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::INTERNAL, RtecScheduler::UNRESOLVED_LOCAL_DEPENDENCIES, @@ -386,21 +625,26 @@ protected: ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::INTERNAL, RtecScheduler::DUPLICATE_NAME)); - // Sort operations by urgency (done by strategy), then - // assign priorities and subpriorities in one pass. - // Sets last scheduled priority. + // Sort operations by urgency (done by strategy), then assign + // priorities and subpriorities in one pass. (Re)computes utilization + // and sets last scheduled priority and last feasible priority. + + void refresh_tuple_ptr_array_i (ACE_ENV_SINGLE_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException, + RtecScheduler::INTERNAL)); + // Refreshes the array of tuple pointers, corrects the count. +/* WSOA merge - commented out virtual void compute_utilization_i (ACE_ENV_SINGLE_ARG_DECL) ACE_THROW_SPEC ((CORBA::SystemException, RtecScheduler::INTERNAL)); // Compute utilization, set last feasible priority. + static void init_rt_info (RtecScheduler::RT_Info &rt_info) ACE_THROW_SPEC ((CORBA::SystemException)); // Helper method to give an RT_Info some reasonable default values - - - +*/ // = Protected class members. RECONFIG_SCHED_STRATEGY sched_strategy_; @@ -419,6 +663,9 @@ protected: long rt_info_count_; // The number of registered RT_Infos. + long rt_info_tuple_count_; + // The number of registered RT_Info tuples. + RT_INFO_TREE rt_info_tree_; // Tree for O(log n) lookup of RT_Infos by name. @@ -430,6 +677,13 @@ protected: // Map for O(1) lookup of RT_Info dependency // set by the called operation's handle. + DEPENDENCY_SET_MAP crit_dependency_set_map_; + // Map for O(1) lookup of RT_Info dependency set. The above two maps + // store the calling and called dependencies. This map stores the + // true dependencies based on criticality propagation direction. For + // two-ways, this is the same as the direction of invocation, + // whereas for one-ways, it is in the opposite direction. + RtecScheduler::handle_t next_handle_; // Next RT_Info descriptor handle to allocate. The first handle is // always 1. @@ -444,6 +698,16 @@ protected: long entry_ptr_array_size_; // Size of the array of scheduling entry pointers. + TAO_RT_Info_Tuple ** tuple_ptr_array_; + // Array of pointers to scheduling entries. This + // array is maintained by the methods that create + // scheduling entries, and sorted in topological + // order and then priority order at various points + // during schedule computation. + + long tuple_ptr_array_size_; + // Size of the array of scheduling entry pointers. + u_long stability_flags_; // Flags indicating whether a stable schedule has been computed // since the last addition or modification of information, and which @@ -468,11 +732,28 @@ protected: CORBA::Double critical_utilization_; // Utilization by critical tasks. + CORBA::Double noncritical_utilization_threshold_; + // Utilization by noncritical tasks. + + CORBA::Double critical_utilization_threshold_; + // Utilization by critical tasks. + ACE_LOCK mutex_; // Mutual exclusion lock for the scheduler itself. This is needed to // synchronize updates and accesses to scheduling information. }; + +template <class ARRAY_ELEMENT_TYPE> void +maintain_scheduling_array (ARRAY_ELEMENT_TYPE ** & current_ptr_array, + long & current_ptr_array_size, + RtecScheduler::handle_t handle + ACE_ENV_ARG_DECL) + ACE_THROW_SPEC ((CORBA::SystemException)); +// Helper function: makes sure there is room in the scheduling pointer +// arrays. This function expands the array eagerly, to minimize time +// overhead for memory allocation (at a cost of some unused space). + #if defined (__ACE_INLINE__) #include "Reconfig_Scheduler_T.i" #endif /* __ACE_INLINE__ */ |