📄 schedentry.h
字号:
/* -*- C++ -*- */
// SchedEntry.h,v 1.19 2003/07/21 23:51:33 dhinton Exp
//
// ============================================================================
//
// = LIBRARY
// sched
//
// = FILENAME
// SchedEntry.h
//
// = CREATION DATE
// 7 February 1998
//
// = AUTHOR
// Chris Gill <cdgill@cs.wustl.edu>
//
// ============================================================================
#ifndef SCHEDENTRY_H
#define SCHEDENTRY_H
#include /**/ "ace/pre.h"
#include "sched_export.h"
#include "orbsvcs/RtecSchedulerC.h"
#include "orbsvcs/Event_Service_Constants.h"
#include "ace/Containers.h"
//////////////////////
// Helper Functions //
//////////////////////
// Forward declaration of classes.
class Task_Entry;
class Task_Entry_Link;
class Dispatch_Entry;
class Dispatch_Entry_Link;
class Dispatch_Proxy_Iterator;
class TAO_RTSched_Export Dispatch_Entry_Link
// = TITLE
// Dispatch Entry Link
//
// = DESCRIPTION
// Light-weight sortable "smart pointer" to a dispatch entry.
//
{
public:
typedef RtecScheduler::handle_t handle_t;
typedef RtecScheduler::Dependency_Info Dependency_Info;
typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
typedef RtecScheduler::OS_Priority OS_Priority;
typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
typedef RtecScheduler::RT_Info RT_Info;
typedef RtecScheduler::Time Time;
typedef RtecScheduler::Period_t Period;
typedef RtecScheduler::Info_Type_t Info_Type;
typedef RtecScheduler::Dependency_Type_t Dependency_Type;
Dispatch_Entry_Link (Dispatch_Entry &d);
// Constructor.
Dispatch_Entry_Link (const Dispatch_Entry_Link &d);
// Copy constructor.
~Dispatch_Entry_Link ();
// Destructor.
int operator < (const Dispatch_Entry_Link &d) const;
// Less than comparison operator.
Dispatch_Entry &dispatch_entry () const;
// Accessor for reference to the dispatch entry.
private:
Dispatch_Entry &dispatch_entry_;
// Dispatch entry to which the smart pointer refers.
};
class TAO_RTSched_Export Task_Entry
// = TITLE
// Task Entry.
//
// = DESCRIPTION
// Wrapper for the RT_Info, which aggregates all its dispatches.
//
{
public:
typedef RtecScheduler::handle_t handle_t;
typedef RtecScheduler::Dependency_Info Dependency_Info;
typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
typedef RtecScheduler::OS_Priority OS_Priority;
typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
typedef RtecScheduler::RT_Info RT_Info;
typedef RtecScheduler::Time Time;
typedef RtecScheduler::Period_t Period;
typedef RtecScheduler::Info_Type_t Info_Type;
typedef RtecScheduler::Dependency_Type_t Dependency_Type;
// Info for DFS traversal, topological sort of call graph.
enum DFS_Status {NOT_VISITED, VISITED, FINISHED};
// Status of merging dispatches.
enum Propagation_Status {SUCCEEDED,
TWO_WAY_DISJUNCTION,
TWO_WAY_CONJUNCTION,
INTERNAL_ERROR,
UNRECOGNIZED_INFO_TYPE};
// Constructor.
Task_Entry ();
// Destructor.
~Task_Entry ();
// Merges dispatches according to info type, update
// relevant scheduling characteristics for this entry.
// Returns 0 if all is well, or -1 if an error occurred.
Propagation_Status merge_dispatches (
ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
ACE_CString & unresolved_locals,
ACE_CString & unresolved_remotes);
// Gets the pointer to the underlying RT_Info.
RT_Info *rt_info () const;
// Sets the pointer to the underlying RT_Info.
void rt_info (RT_Info *info);
// Gets the effective period for the task entry.
Period effective_period () const;
// Sets the effective period for the task entry.
void effective_period (Period p);
// Sets when the node was discovered in DFS traversal.
void discovered (long l);
// Gets when the node was discovered in DFS traversal.
long discovered () const;
// Sets when the node was finished in DFS traversal.
void finished (long l);
// Gets when the node was finished in DFS traversal.
long finished () const;
// Sets DFS traversal status of the node.
void dfs_status (DFS_Status ds);
// Gets DFS traversal status of the node.
DFS_Status dfs_status () const;
// Sets a flag indicating whether node is a thread delineator.
void is_thread_delineator (int i);
// Gets the flag indicating whether node is a thread delineator.
int is_thread_delineator () const;
// Sets a flag indicating whether node has unresolved remote dependencies.
void has_unresolved_remote_dependencies (int i);
// Gets the flag indicating whether node has unresolved remote dependencies.
int has_unresolved_remote_dependencies () const;
// Sets a flag indicating whether node has unresolved local dependencies.
void has_unresolved_local_dependencies (int i);
// Gets the flag indicating whether node has unresolved local dependencies.
int has_unresolved_local_dependencies () const;
// Gets the set of links to Task Entries which this entry calls.
ACE_Unbounded_Set <Task_Entry_Link *> & calls ();
// Gets the set of links to Task Entries which call this entry.
ACE_Unbounded_Set <Task_Entry_Link *> & callers ();
// Gets the set of arrivals in the effective period.
ACE_Ordered_MultiSet<Dispatch_Entry_Link> &dispatches ();
// Gets the type of RT_Info the entry wraps.
Info_Type info_type () const;
// Gets the effective execution time for the task entry.
u_long effective_execution_time () const;
private:
// Prohibits calls of the given type: currently used to enforce
// the notion that two-way calls to disjunctive or conjunctive
// RT_Infos do not have any defined meaning, and thus should be
// considered dependency specification errors: if these constraints
// are removed in the future, this method should be removed as well.
// Returns 0 if all is well, or -1 if an error has occurred.
int prohibit_dispatches (Dependency_Type dt);
// Performs a disjunctive merge of arrival times of calls of the given
// type: all arrival times of all callers of that type are duplicated by
// the multiplier and repetition over the new frame size and merged.
// Returns 0 if all is well, or -1 if an error has occurred.
int disjunctive_merge (
Dependency_Type dt,
ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
ACE_CString & unresolved_locals,
ACE_CString & unresolved_remotes);
// Performs a conjunctive merge of arrival times of calls of the given
// type: all arrival times of all callers of that type are duplicated
// by the multiplier and repetition over the new frame size and then
// iteratively merged by choosing the maximal arrival time at
// the current position in each queue (iteration is in lockstep
// over all queues, and ends when any queue ends). Returns 0 if
// all is well, or -1 if an error has occurred.
int conjunctive_merge (
Dependency_Type dt,
ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
ACE_CString & unresolved_locals,
ACE_CString & unresolved_remotes);
// This static method is used to reframe an existing dispatch set
// to the given new period multiplier, creating new instances of
// each existing dispatch (with adjusted arrival and deadline)
// in each successive sub-frame. Returns 1 if the set was reframed
// to a new period, 0 if the set was not changed (the new period
// was not a multiple of the old one), or -1 if an error occurred.
static int reframe (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
Task_Entry &owner,
ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
u_long &set_period, u_long new_period);
// This static method is used to merge an existing dispatch set,
// multiplied by the given multipliers for the period and number of
// instances in each period of each existing dispatch, into the
// given "into" set, without affecting the "from set". Returns 1 if
// the source set was correctly merged into the destination set,
// 0 if nothing happened, and -1 if an error occurred.
static int merge_frames (ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries,
Task_Entry &owner,
ACE_Ordered_MultiSet <Dispatch_Entry_Link> &dest,
ACE_Ordered_MultiSet <Dispatch_Entry_Link> &src,
u_long &dest_period,
u_long src_period,
u_long number_of_calls = 1,
u_long starting_dest_sub_frame = 0);
// A pointer to the underlying RT_Info.
RT_Info *rt_info_;
// The effective period for the task entry.
u_long effective_period_;
// The set of arrivals in the entry's effective period.
ACE_Ordered_MultiSet<Dispatch_Entry_Link> dispatches_;
// Depth-first-search status of the entry.
DFS_Status dfs_status_;
// Depth-first-search discovery order of the entry.
long discovered_;
// Depth-first-search completion order of the entry.
long finished_;
// Flag identifying threads in the call graph.
int is_thread_delineator_;
// Flag indicating whether or not there are unresolved remote
// dependencies in the entry's dependency call chain.
int has_unresolved_remote_dependencies_;
// Flag indicating whether or not there are unresolved local
// dependencies in the entry's dependency call chain.
int has_unresolved_local_dependencies_;
// Set of links to Task Entries which this entry calls.
ACE_Unbounded_Set <Task_Entry_Link *> calls_;
// Set of links to Task Entries which call this entry.
ACE_Unbounded_Set <Task_Entry_Link *> callers_;
};
// Wrapper for dependencies between RT_Infos
class TAO_RTSched_Export Task_Entry_Link
{
public:
typedef RtecScheduler::handle_t handle_t;
typedef RtecScheduler::Dependency_Info Dependency_Info;
typedef RtecScheduler::Preemption_Priority_t Preemption_Priority;
typedef RtecScheduler::OS_Priority OS_Priority;
typedef RtecScheduler::Preemption_Subpriority_t Sub_Priority;
typedef RtecScheduler::RT_Info RT_Info;
typedef RtecScheduler::Time Time;
typedef RtecScheduler::Period_t Period;
typedef RtecScheduler::Info_Type_t Info_Type;
typedef RtecScheduler::Dependency_Type_t Dependency_Type;
// ctor
Task_Entry_Link (Task_Entry &caller,
Task_Entry &called,
CORBA::Long number_of_calls,
Dependency_Type dependency_type);
// accessor: number of calls
CORBA::Long number_of_calls () const;
// accessor: dependency type
Dependency_Type dependency_type () const;
// accessor: calling task entry
Task_Entry &caller () const;
// accessor: called task entry
Task_Entry &called () const;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -