📄 reconfig_sched_utils_t.h
字号:
/* -*- C++ -*- */
// Reconfig_Sched_Utils_T.h,v 1.13 2003/08/24 18:18:25 venkita Exp
// ============================================================================
//
// = LIBRARY
// orbsvcs
//
// = FILENAME
// Reconfig_Scheduler_Utils_T.h
//
// = AUTHOR
// Chris Gill <cdgill@cs.wustl.edu>
//
// ============================================================================
#ifndef TAO_RECONFIG_SCHED_UTILS_T_H
#define TAO_RECONFIG_SCHED_UTILS_T_H
#include /**/ "ace/pre.h"
#include "ace/config-all.h"
#include "Reconfig_Sched_Utils.h"
#include "ace/Hash_Map_Manager.h"
#if !defined (ACE_LACKS_PRAGMA_ONCE)
# pragma once
#endif /* ACE_LACKS_PRAGMA_ONCE */
//////////////////////////////////////////
// Reconfig Sched Entry Visitor classes //
//////////////////////////////////////////
template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
class TAO_RSE_Dependency_Visitor :
public TAO_Reconfig_Sched_Entry_Visitor
// = TITLE
// A base class for scheduler entry visitors that use a
// dependency map to traverse a dependency graph over entries.
//
// = DESCRIPTION
// This class hold the maps and a constructor that
// derived classes may call to pass them in.
{
public:
typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
RtecScheduler::Dependency_Set*,
ACE_Hash<RtecScheduler::handle_t>,
ACE_Equal_To<RtecScheduler::handle_t>,
ACE_LOCK> DEPENDENCY_SET_MAP;
// Type of map used for O(1) lookup of RT_Info
// dependency sets by caller or called handle.
typedef ACE_Hash_Map_Manager_Ex<RtecScheduler::handle_t,
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.
TAO_RSE_Dependency_Visitor
(DEPENDENCY_SET_MAP & dependency_map,
RT_INFO_MAP & rt_info_map);
// Constructor.
virtual int visit (TAO_Reconfig_Scheduler_Entry &);
// 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.
protected:
/* WSOA merge - commented out
virtual int unconditional_action (TAO_Reconfig_Scheduler_Entry &rse);
// Performs an unconditional action when the entry is first reached.
// Returns 0 for success, and -1 if an error occurred.
*/
virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
// Performs an action on the entry prior to visiting any of
// its successors. Returns 0 on success and -1 on error.
virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
TAO_Reconfig_Scheduler_Entry &successor,
const RtecScheduler::Dependency_Info &di);
// Performs an action on a successor entry prior to visiting
// it. Returns 0 if the successor should be visited recursively,
// 1 if the successor should not be visited, and -1 on error.
virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
// Performs an action on the entry after visiting all of
// its successors. Returns 0 on success and -1 on error.
DEPENDENCY_SET_MAP & dependency_map_;
// Map of dependencies between RT_Info handles.
RT_INFO_MAP & rt_info_map_;
// Map of handles into RT_Infos.
};
template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
class TAO_RSE_DFS_Visitor :
public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
// = TITLE
// A scheduler entry visitor that marks nodes with DFS start
// and finish times.
//
// = DESCRIPTION
// This class does DFS traversal marking of each node it visits,
// as appropriate according to DFS state markers.
{
public:
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);
// Constructor.
protected:
virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
TAO_Reconfig_Scheduler_Entry &successor,
const RtecScheduler::Dependency_Info &di);
// Marks whether or not successor is a thread delineator prior to
// visiting it. Returns 0 on success and -1 on error.
virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
private:
int DFS_time_;
// Keeps track of DFS start and finish times.
};
template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
class TAO_RSE_SCC_Visitor :
public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
// = TITLE
// A scheduler entry visitor that checks for cycles in the graph.
//
// = DESCRIPTION
// This class, when applied to nodes in the transpose of the DFS graph as
// ordered for the strongly connected components algorithm, will
// flag cycles in the graph.
{
public:
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);
// Constructor.
int number_of_cycles (void);
// Accessor for number of cycles detected in traversal.
int in_a_cycle (void);
// Accessor for whether or not the recursion is within a previously
// detected cycle.
void in_a_cycle (int);
// Mutator for whether or not the recursion is within a previously
// detected cycle.
protected:
/* WSOA merge - commented out
virtual int unconditional_action (TAO_Reconfig_Scheduler_Entry &rse);
// If the entry is a thread delineator, sets its effective period and
// execution multiplier from the values in its corresponding RT_Info.
// Returns 0 for success, and -1 if an error occurred.
*/
virtual int precondition (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
virtual int prefix_action (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
virtual int pre_recurse_action (TAO_Reconfig_Scheduler_Entry &entry,
TAO_Reconfig_Scheduler_Entry &successor,
const RtecScheduler::Dependency_Info &di);
// 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).
virtual int postfix_action (TAO_Reconfig_Scheduler_Entry &rse);
// 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.
private:
int DFS_time_;
// Keeps track of DFS start and finish times.
int number_of_cycles_;
// Keeps track of DFS start and finish times.
int in_a_cycle_;
// Indicates whether or not the recursion is
// currently within a previously discovered cycle.
};
template <class RECONFIG_SCHED_STRATEGY, class ACE_LOCK>
class TAO_RSE_Reverse_Propagation_Visitor :
public TAO_RSE_Dependency_Visitor<RECONFIG_SCHED_STRATEGY, ACE_LOCK>
// = TITLE
// A scheduler entry visitor that propagates aggregate execution
// times from called to calling nodes in a topologically ordered
// graph.
//
// = DESCRIPTION
// This class computes the aggregate execution time of each node
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -