diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp | 880 |
1 files changed, 0 insertions, 880 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp b/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp deleted file mode 100644 index 6a5d3a3707b..00000000000 --- a/TAO/orbsvcs/orbsvcs/Sched/Reconfig_Sched_Utils_T.cpp +++ /dev/null @@ -1,880 +0,0 @@ -// ============================================================================ -// -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// orbsvcs -// -// = FILENAME -// Reconfig_Sched_Utils_T.cpp -// -// = AUTHOR -// Chris Gill <cdgill@cs.wustl.edu> -// -// ============================================================================ - -#ifndef TAO_RECONFIG_SCHED_UTILS_T_C -#define TAO_RECONFIG_SCHED_UTILS_T_C - -// The templatized method parameters needed by this file are -// hopelessly broken on pre-2.8 versions of g++ -#if (! defined (__GNUC__)) || (__GNUC__ > 2) || \ -(__GNUC__ == 2 && defined (__GNUC_MINOR__) && __GNUC_MINOR__ >= 8) - -#include "Reconfig_Sched_Utils_T.h" -#include "ace/Sched_Params.h" - -#if !defined (ACE_LACKS_PRAGMA_ONCE) -# pragma once -#endif /* ACE_LACKS_PRAGMA_ONCE */ - -#if !defined (__ACE_INLINE__) -#include "Reconfig_Sched_Utils_T.i" -#endif /* __ACE_INLINE__ */ - -ACE_RCSID(Sched, Reconfig_Sched_Utils_T, "$Id$") - -//////////////////////////////// -// TAO_RSE_Dependency_Visitor // -//////////////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -TAO_RSE_Dependency_Visitor - (DEPENDENCY_SET_MAP & dependency_map, RT_INFO_MAP & rt_info_map) - : dependency_map_ (dependency_map), - rt_info_map_ (rt_info_map) -{ -} - - -// Visit a Reconfig Scheduler Entry. This method calls protected hook -// methods that can be overridden by derived classes, according to the -// Template Method design pattern. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -visit (TAO_Reconfig_Scheduler_Entry &rse) -{ - int result = 0; - - // Call unconditional action method, which performs any necessary - // modifications that are applied to each node unconditionally. - if (this->unconditional_action (rse) < 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "TAO_RSE_Dependency_Visitor::" - "visit: error from unconditional action.\n"), -1); - } - - // Call precondition hook method, and only proceed if the - // precondition returns 0 for success. - - result = this->precondition (rse); - if (result < 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "TAO_RSE_Dependency_Visitor::" - "visit: error from precondition evaluation.\n"), -1); - } - - if (result == 0) - { - // Call prefix action method, which performs any necessary - // modifications on the node prior to visiting its successors. - if (this->prefix_action (rse) < 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "TAO_RSE_Dependency_Visitor::" - "visit: error from prefix action.\n"), -1); - } - - // Get the dependency set for the current entry. - RtecScheduler::Dependency_Set *dependency_set = 0; - if (dependency_map_.find (rse.actual_rt_info ()->handle, - dependency_set) == 0) - { - // Iterate over the set of dependencies for the current entry. - TAO_Reconfig_Scheduler_Entry * next_rse = 0; - RtecScheduler::RT_Info *next_rt_info; - for (u_int i = 0; i < dependency_set->length (); ++i) - { - // Take the handle from the dependency and use it - // to obtain an RT_Info pointer from the map. - if (rt_info_map_.find ((*dependency_set) [i].rt_info, - next_rt_info) != 0) - { - ACE_ERROR_RETURN ((LM_ERROR, "RT_Info not found.\n"), -1); - } - - // Extract a pointer to the scheduling entry from the RT_Info. - - if (next_rt_info == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, "RT_Info in map was null.\n"), - -1); - } - - // Reference the associated scheduling entry: the double cast is - // needed to ensure that the size of the pointer and the size of the - // stored magic cookie are the same (see the definition of - // ptr_arith_t in ACE to grok how this works portably). - next_rse = - ACE_LONGLONG_TO_PTR (TAO_Reconfig_Scheduler_Entry *, - next_rt_info->volatile_token); - if (next_rse == 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "Entry pointer in RT_Info was null.\n"), - -1); - } - - // Call pre-recursion action method, which performs any necessary - // modifications to a successor (or the entry) prior to recursing - // on the successor. - result = this->pre_recurse_action (rse, *next_rse, - (*dependency_set) [i]); - if (result < 0) - { - ACE_ERROR_RETURN ((LM_ERROR, - "TAO_RSE_Dependency_Visitor::visit: " - "error from pre-recursion action.\n"), - -1); - } - - // If the pre-recursion action returned 0, visit the successor. - if (result == 0) - { - this->visit (*next_rse); - } - } - - } - - // Call postfix action method, which performs any necessary - // modifications on the node after visiting all its successors. - if (this->postfix_action (rse) < 0) - { - ACE_ERROR_RETURN ((LM_ERROR, "TAO_RSE_Dependency_Visitor::" - "visit: error from postfix action.\n"), -1); - } - } - - return 0; -} - - -// Performs an unconditional action when the entry is first reached. -// Returns 0 for success, and -1 if an error occurred. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unconditional_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - // Default behavior: just return success. - ACE_UNUSED_ARG (rse); - return 0; -} - - -// Tests whether or not any conditional actions should be taken for -// the entry. Returns 0 if the actions should be applied, 1 if the -// entry should be left alone, and -1 if an error occurred. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -precondition (TAO_Reconfig_Scheduler_Entry &rse) -{ - // Default behavior: just return success. - ACE_UNUSED_ARG (rse); - return 0; -} - - -// Performs an action on the entry prior to visiting any of -// its successors. Returns 0 on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -prefix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - // Default behavior: just return success. - ACE_UNUSED_ARG (rse); - return 0; -} - - -// Performs an action on a successor entry prior to visiting -// it. Returns 0 on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry, - TAO_Reconfig_Scheduler_Entry &successor, - const RtecScheduler::Dependency_Info &di) -{ - // Default behavior: just return success. - ACE_UNUSED_ARG (entry); - ACE_UNUSED_ARG (successor); - ACE_UNUSED_ARG (di); - return 0; -} - - -// Performs an action on the entry after visiting all of -// its successors. Returns 0 on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -postfix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - // Default behavior: just return success. - ACE_UNUSED_ARG (rse); - return 0; -} - - - -///////////////////////// -// TAO_RSE_DFS_Visitor // -///////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> -TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -TAO_RSE_DFS_Visitor - (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map, - ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map) - : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> - (dependency_map, rt_info_map), - DFS_time_ (0) -{ -} - - -// Makes sure the entry has not previously been visited in forward DFS. -// Returns 0 if the actions should be applied, 1 if the entry -// should be left alone, and -1 if an error occurred. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -precondition (TAO_Reconfig_Scheduler_Entry &rse) -{ - return (rse.fwd_dfs_status () == - TAO_Reconfig_Scheduler_Entry::NOT_VISITED) - ? 0 : 1; -} - - -// Marks entry as forward visited and sets its forward DFS start -// time, prior to visiting any of its successors. Returns 0 on -// success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -prefix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - rse.fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::VISITED); - rse.fwd_discovered (this->DFS_time_++); - return 0; -} - - -// Marks whether or not successor is a thread delineator prior to -// visiting it. Returns 0 on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry, - TAO_Reconfig_Scheduler_Entry &successor, - const RtecScheduler::Dependency_Info &di) -{ - ACE_UNUSED_ARG (entry); - ACE_UNUSED_ARG (di); - - // Operations we reached via a dependency and that do not - // specify a period are not thread delineators. - if (successor.actual_rt_info ()->period == 0 && - successor.actual_rt_info ()->threads == 0) - { - successor.is_thread_delineator (0); - } - - return 0; -} - - -// Marks entry as forward finished and sets its forward DFS finish -// time, after all of its successors have been visited. Returns 0 -// on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_DFS_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -postfix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - rse.fwd_dfs_status (TAO_Reconfig_Scheduler_Entry::FINISHED); - rse.fwd_finished (this->DFS_time_++); - return 0; -} - - -///////////////////////// -// TAO_RSE_SCC_Visitor // -///////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -TAO_RSE_SCC_Visitor - (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map, - ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map) - : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> - (dependency_map, rt_info_map), - DFS_time_ (0), - number_of_cycles_ (0), - in_a_cycle_ (0) -{ -} - - -// Accessor for number of cycles detected in traversal. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -number_of_cycles (void) -{ - return this->number_of_cycles_; -} - - -// Accessor for whether or not the recursion is within a previously -// detected cycle. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -in_a_cycle (void) -{ - return this->in_a_cycle_; -} - - -// Mutator for whether or not the recursion is within a previously -// detected cycle. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -in_a_cycle (int i) -{ - this->in_a_cycle_ = i; -} - - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unconditional_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - if (rse.is_thread_delineator () && - rse.effective_period () == 0) - { - rse.effective_period (rse.actual_rt_info ()->period); - long threads = rse.actual_rt_info ()->threads; - rse.effective_exec_multiplier (threads > 0 ? threads : 1); - } - - return 0; -} - -// Makes sure the entry has not previously been visited in the -// reverse DFS (call graph transpose) direction. Returns 0 if -// the actions should be applied, 1 if the entry should be left -// alone, and -1 if an error occurred. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -precondition (TAO_Reconfig_Scheduler_Entry &rse) -{ - return (rse.rev_dfs_status () == - TAO_Reconfig_Scheduler_Entry::NOT_VISITED) - ? 0 : 1; -} - - -// Marks reverse status as visited and sets reverse start time for -// entry, prior to visiting any of its successors. Returns 0 on -// success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -prefix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - rse.rev_dfs_status (TAO_Reconfig_Scheduler_Entry::VISITED); - rse.rev_discovered (this->DFS_time_++); - return 0; -} - - -// Checks reverse status of each successor. For any that have not -// been previously visited, it complains about the entry and -// successor being part of a cycle, stores the fact that a cycle was -// detected, and maintains a count of the total number of cycles -// (strongly connected components). Returns 0 on success and -1 on -// an error (finding a cycle is not considered an error, at least as -// far as this method is concerned). - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry, - TAO_Reconfig_Scheduler_Entry &successor, - const RtecScheduler::Dependency_Info &di) -{ - ACE_UNUSED_ARG (di); - - if (successor.rev_dfs_status () == - TAO_Reconfig_Scheduler_Entry::NOT_VISITED) - { - if (this->in_a_cycle () == 0) - { - this->in_a_cycle (1); - ++this->number_of_cycles_; - } - - ACE_DEBUG ((LM_ERROR, - "RT_Infos \"%s\" and \"%s\" are part of dependency cycle %d.\n", - entry.actual_rt_info ()->entry_point.in (), - successor.actual_rt_info ()->entry_point.in (), - this->number_of_cycles_)); - } - - return 0; -} - - -// Sets the entry's reverse finish time and marks it as finished in -// the reverse DFS traversal, after visiting all of its successors. -// Returns 0 on success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_SCC_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -postfix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - rse.rev_dfs_status (TAO_Reconfig_Scheduler_Entry::FINISHED); - rse.rev_finished (this->DFS_time_++); - return 0; -} - - -///////////////////////////////// -// TAO_RSE_Propagation_Visitor // -///////////////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -TAO_RSE_Propagation_Visitor - (ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::DEPENDENCY_SET_MAP & dependency_map, - ACE_TYPENAME TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>::RT_INFO_MAP & rt_info_map) - : TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK> (dependency_map, rt_info_map), - unresolved_locals_ (0), - unresolved_remotes_ (0), - thread_specification_errors_ (0) -{ -} - - -// Accessor for number of nodes with unresolved local dependencies. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unresolved_locals (void) -{ - return this->unresolved_locals_; -} - - -// Mutator for number of nodes with unresolved local dependencies. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unresolved_locals (int i) -{ - this->unresolved_locals_ = i; -} - - -// Accessor for number of nodes with unresolved remote dependencies. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unresolved_remotes (void) -{ - return this->unresolved_remotes_; -} - - -// Mutator for number of nodes with unresolved remote dependencies. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -unresolved_remotes (int i) -{ - this->unresolved_remotes_ = i; -} - -// Accessor for number of nodes with thread specification errors. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -thread_specification_errors (void) -{ - return this->thread_specification_errors_; -} - - -// Mutator for number of nodes with thread specification errors. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> void -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -thread_specification_errors (int i) -{ - this->thread_specification_errors_ = i; -} - - -// Tests the entry for possibly having unresolved remote or local -// dependencies prior to visiting any of its successors, and also -// checks for thread specification errors. Returns 0 on success and -// -1 on error (having unresolved dependencies or thread specification -// problems is not considered an error, at least for this method). - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -prefix_action (TAO_Reconfig_Scheduler_Entry &rse) -{ - // Complain about anything that is still marked as a thread - // delineator but does not have a period: if it has threads, it is a - // specification error. Otherwise, if it's not a remote dependant - // (per RT_Info's info_type field) it has unresolved *local* - // dependencies. - - if (rse.is_thread_delineator ()) - { - if (rse.actual_rt_info ()->period == 0) - { - if (rse.actual_rt_info ()->threads == 0) - { - if (rse.actual_rt_info ()->info_type == - RtecScheduler::REMOTE_DEPENDANT) - { - ++this->unresolved_remotes_; - - ACE_DEBUG ((LM_ERROR, - "RT_Info \"%s\" has unresolved " - "remote dependencies.\n", - rse.actual_rt_info ()->entry_point.in ())); - } - else - { - ++this->unresolved_locals_; - - ACE_DEBUG ((LM_ERROR, - "RT_Info \"%s\" has unresolved " - "local dependencies.\n", - rse.actual_rt_info ()->entry_point.in ())); - } - } - else - { - // Specification error: any RT_Info that specifies threads - // must also specify a period. - ++this->thread_specification_errors_; - ACE_DEBUG ((LM_ERROR, - "RT_Info \"%s\" specifies %ld " - "threads, but no period.\n", - rse.actual_rt_info ()->entry_point.in (), - rse.actual_rt_info ()->threads)); - } - } - } - - return 0; -} - - -// Propagates effective period and execution time multiplier from -// entry to successor prior to visiting successor. Returns 0 on -// success and -1 on error. - -template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK> int -TAO_RSE_Propagation_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>:: -pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry, - TAO_Reconfig_Scheduler_Entry &successor, - const RtecScheduler::Dependency_Info &di) -{ - ACE_UNUSED_ARG (di); - - // This method makes a conservative estimate in cases where periods - // differ, taking the minimum frame size and dividing down the - // execution multiplier of the longer frame (and rounding the result - // upward as needed). A more exact computation could be achieved - // by merging sets of arrivals and frame offsets, but that - // would in turn cost more in run-time computation time. - // NOTE: this approach *only* works for harmonic periods. For - // non-harmonic periods, the set merge approach is necessary. - - if (successor.effective_period () == 0) - { - // If this is the first dependency by which the successor has - // been reached, and the successor is not itself a thread - // delineator, then simply adopt the effective period and - // execution time multiplier of the shorter period. - successor.effective_period (entry.effective_period ()); - successor.effective_exec_multiplier (entry.effective_exec_multiplier ()); - } - else - { - // Otherwise, take the smaller of the two periods, and divide down - // the execution multipliers accordingly. - - long new_exec_multiplier = 0; - long old_exec_multiplier = 0; - - if (successor.effective_period () < entry.effective_period ()) - { - // Store the previous execution multiplier. - old_exec_multiplier = successor.effective_exec_multiplier (); - - // Divide down the new execution multiplier. - new_exec_multiplier = - ACE_static_cast (long, - (old_exec_multiplier * - successor.effective_period ()) / - entry.effective_period ()); - - // Adjust for round-off error. - if (old_exec_multiplier > - ACE_static_cast (long, - (new_exec_multiplier * - entry.effective_period ()) / - successor.effective_period ())) - { - ++new_exec_multiplier; - } - - // Set the successor's effective period and execution multiplier. - successor.effective_period (entry.effective_period ()); - successor.effective_exec_multiplier (entry.effective_exec_multiplier () + - new_exec_multiplier); - } - else - { - // Store the previous execution multiplier. - old_exec_multiplier = entry.effective_exec_multiplier (); - - // Divide down the new execution multiplier. - new_exec_multiplier = - ACE_static_cast (long, - old_exec_multiplier * - entry.effective_period () / - successor.effective_period ()); - - // Adjust for round-off error. - if (old_exec_multiplier > - ACE_static_cast (long, - new_exec_multiplier * - successor.effective_period () / - entry.effective_period ())) - { - ++new_exec_multiplier; - } - - // Just set the successor's execution multiplier (the period is unchanged). - successor.effective_exec_multiplier (successor.effective_exec_multiplier () + - new_exec_multiplier); - } - } - - // Do not recurse on the successor node, just continue to the next successor. - return 1; -} - - -//////////////////////////////////// -// class TAO_RSE_Priority_Visitor // -//////////////////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY> -TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY>:: -TAO_RSE_Priority_Visitor (RtecScheduler::handle_t handles, - TAO_Reconfig_Scheduler_Entry ** entry_ptr_array) - : previous_entry_ (0), - first_subpriority_entry_ (0), - priority_ (0), - subpriority_ (0), - os_priority_ (ACE_Sched_Params::priority_max (ACE_SCHED_FIFO, - ACE_SCOPE_PROCESS)), - handles_ (handles), - entry_ptr_array_ (entry_ptr_array) -{ -} - - -// Visit a Reconfig Scheduler Entry. This method -// assigns a priority and subpriority value to each -// entry. Priorities are assigned in increasing value -// order, with lower numbers corresponding to higher -// priorities. - -template <class RECONFIG_SCHED_STRATEGY> int -TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY>::visit (TAO_Reconfig_Scheduler_Entry &rse) -{ - int result = 0; - - if (previous_entry_ == 0) - { - // Indicate a new priority level was assigned. - result = 1; - - // If we're on the first node, store the start of the array - // as the start of the priority level. - first_subpriority_entry_ = this->entry_ptr_array_; - rse.actual_rt_info ()->preemption_subpriority = subpriority_; - } - else - { - if (RECONFIG_SCHED_STRATEGY::compare_priority (*previous_entry_, rse) == 0) - { - // Subpriority is increased at each new node. - ++subpriority_; - - // Store negative value of subpriority level: will be - // adjusted by adding back in the total number of - // subpriorities in the priority level, so the - // subpriorities are assigned in decreasing order. - rse.actual_rt_info ()->preemption_subpriority = - subpriority_; - } - else - { - // Indicate a new priority level was assigned. - result = 1; - - // Iterate back through and adjust the subpriority levels. - for (int i = 0; i <= subpriority_; ++i, ++first_subpriority_entry_) - { - (*first_subpriority_entry_)-> - actual_rt_info ()-> - preemption_subpriority += subpriority_; - } - - subpriority_ = 0; - rse.actual_rt_info ()->preemption_subpriority = subpriority_; - - ++priority_; - os_priority_ = ACE_Sched_Params::previous_priority (ACE_SCHED_FIFO, - os_priority_, - ACE_SCOPE_PROCESS); - } - } - - // Assign the entry's priority and subpriority values - rse.actual_rt_info ()->priority = os_priority_; - rse.actual_rt_info ()->preemption_priority = priority_; - - // Remember the current entry for the next visit. - previous_entry_ = &rse; - - return result; -} - - -// Finishes scheduler entry priority assignment by iterating over the -// remaining entries in the last subpriority level, and adjusting -// their subpriorities. -template <class RECONFIG_SCHED_STRATEGY> int -TAO_RSE_Priority_Visitor<RECONFIG_SCHED_STRATEGY>::finish () -{ - // Iterate back through and adjust the subpriority levels. - for (int i = 0; i <= subpriority_; ++i, ++first_subpriority_entry_) - { - (*first_subpriority_entry_)-> - actual_rt_info ()-> - preemption_subpriority += subpriority_; - } - - // Indicate no new proirity level was identified. - return 0; -} - -/////////////////////////////////////// -// class TAO_RSE_Utilization_Visitor // -/////////////////////////////////////// - -// Constructor. - -template <class RECONFIG_SCHED_STRATEGY> -TAO_RSE_Utilization_Visitor<RECONFIG_SCHED_STRATEGY>::TAO_RSE_Utilization_Visitor () - : critical_utilization_ (0.0), - noncritical_utilization_ (0.0) -{ -} - -// Visit a Reconfig Scheduler Entry. This method -// determines the utilization by the entry, and -// adds it to the critical or non-critical utilization, -// depending on whether or not the strategy says the -// operation is critical. - -template <class RECONFIG_SCHED_STRATEGY> int -TAO_RSE_Utilization_Visitor<RECONFIG_SCHED_STRATEGY>::visit (TAO_Reconfig_Scheduler_Entry &rse) -{ - CORBA::Double entry_period = rse.effective_period (); - CORBA::Double entry_time = ACE_static_cast ( - CORBA::Double, - ACE_UINT64_DBLCAST_ADAPTER (rse.actual_rt_info ()-> - worst_case_execution_time)); - CORBA::Double entry_mult = rse.effective_exec_multiplier (); - - if (RECONFIG_SCHED_STRATEGY::is_critical (rse)) - { - this->critical_utilization_ = - (entry_mult * entry_time) / entry_period; - } - else - { - this->noncritical_utilization_ = - (entry_mult * entry_time) / entry_period; - } - - return 0; -} - - -// Accessor for utilization by critical operations. - -template <class RECONFIG_SCHED_STRATEGY> CORBA::Double -TAO_RSE_Utilization_Visitor<RECONFIG_SCHED_STRATEGY>::critical_utilization () -{ - return this->critical_utilization_; -} - - -// Accessor for utilization by noncritical operations. - -template <class RECONFIG_SCHED_STRATEGY> CORBA::Double -TAO_RSE_Utilization_Visitor<RECONFIG_SCHED_STRATEGY>::noncritical_utilization () -{ - return this->noncritical_utilization_; -} - - -#endif /* __GNUC__ */ - -#endif /* TAO_RECONFIG_SCHED_UTILS_T_C */ |