📄 schedentry.h
字号:
private:
// the number of calls of the operation
CORBA::Long number_of_calls_;
// the calling operation
Task_Entry &caller_;
// the called operation
Task_Entry &called_;
// the type of call dependency
Dependency_Type dependency_type_;
};
class TAO_RTSched_Export Dispatch_Entry
{
// = TITLE
// Dispatch Entry
//
// = DESCRIPTION
// Descriptor object for a single dispatch of an operation.
//
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;
typedef u_long Dispatch_Id;
// ctor
Dispatch_Entry (Time arrival,
Time deadline,
Preemption_Priority priority,
OS_Priority os_priority,
Task_Entry &task_entry,
Dispatch_Entry *original_dispatch = 0);
// copy ctor
Dispatch_Entry (const Dispatch_Entry &d);
// id accessor
Dispatch_Id dispatch_id () const;
// arrival accessor
Time arrival () const;
// deadline accessor
Time deadline () const;
// scheduler priority accessor and mutator
Preemption_Priority priority () const;
void priority (Preemption_Priority p);
// scheduler priority accessor and mutator
OS_Priority OS_priority () const;
void OS_priority (OS_Priority p);
// dynamic subpriority accessor and mutator
Sub_Priority dynamic_subpriority () const;
void dynamic_subpriority (Sub_Priority p);
// static subpriority accessor and mutator
Sub_Priority static_subpriority () const;
void static_subpriority (Sub_Priority p);
// task entry accessor
Task_Entry &task_entry () const;
// LT comparator
// TBD - make this a global comparison operator
// instead of a class member function
int operator < (const Dispatch_Entry &d) const;
// accessor for pointer to original dispatch
Dispatch_Entry *original_dispatch ();
private:
// TBD - add reference counting to Dispatch Entry class,
// make the link a friend, up/down count as links come and go,
// and call entry dtor when ref count drops to 0
// stores the next dispatch entry id to be used
static Dispatch_Id next_id_;
// the id of the current dispatch entry
Dispatch_Id dispatch_id_;
// scheduler priority of the current dispatch entry
Preemption_Priority priority_;
// OS priority of the current dispatch entry
OS_Priority OS_priority_;
// scheduler dynamic subpriority of the current dispatch entry
Sub_Priority dynamic_subpriority_;
// scheduler static subpriority of the current dispatch entry
Sub_Priority static_subpriority_;
// the arrival time of the current dispatch entry
Time arrival_;
// the deadline of the current dispatch entry
Time deadline_;
// stores the id of the related task entry
Task_Entry &task_entry_;
// stores a pointer to the original dispatch entry if this
// is a dispatch generated by expanding the original frame
Dispatch_Entry *original_dispatch_;
};
class TAO_RTSched_Export Dispatch_Proxy_Iterator
// = TITLE
// This class implements an iterator abstraction over a virtual
// frame size and number of calls, using an actual ordered
// multiset of dispatch entries over an actual frame size.
// It also serves as a proxy for the virtual dispatch to which
// it refers. Rhetorical question: is it possible to separate
// the iterator and proxy abstractions here without defeating the
// purpose of the design, which is to avoid constructing
// superfluous dispatch entries (per the conjunctive merge use case) ?
{
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_Proxy_Iterator (ACE_Ordered_MultiSet <Dispatch_Entry_Link> &set,
u_long actual_frame_size,
u_long virtual_frame_size,
u_long number_of_calls_ = 1,
u_long starting_sub_frame = 0);
// ctor
////////////////////////
// iterator interface //
////////////////////////
int done () const;
// returns 0 if there are more entries to see, 1 if not
int first (u_int sub_frame = 0);
// positions the iterator at the first entry of the passed
// sub-frame, returns 1 if it could position the iterator
// correctly, 0 if not, and -1 if an error occurred.
int last ();
// positions the iterator at the last entry of the total
// frame, returns 1 if it could position the iterator
// correctly, 0 if not, and -1 if an error occurred.
int advance ();
// positions the iterator at the next entry of the total
// frame, returns 1 if it could position the iterator
// correctly, 0 if not, and -1 if an error occurred.
int retreat ();
// positions the iterator at the previous entry of the total
// frame, returns 1 if it could position the iterator
// correctly, 0 if not, and -1 if an error occurred.
/////////////////////
// proxy interface //
/////////////////////
Time arrival () const;
// returns the adjusted arrival time of the virtual entry
Time deadline () const;
// returns the adjusted deadline time of the virtual entry
Preemption_Priority priority () const;
// returns the scheduler priority of the virtual entry
OS_Priority OS_priority () const;
// returns the OS priority of the virtual entry
private:
u_long number_of_calls_;
// the number of calls corresponding to each actual dispatch
u_long current_call_;
// the current call number for this dispatch (zero based)
u_long actual_frame_size_;
// the frame size of the actual dispatches
u_long virtual_frame_size_;
// the virtaul frame size over which to iterate
u_long current_frame_offset_;
// the current offset into the virtual frame
// (should be a multiple of the actual frame size)
ACE_Ordered_MultiSet_Iterator <Dispatch_Entry_Link> iter_;
};
class TAO_RTSched_Export TimeLine_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;
// time slice constructor
TimeLine_Entry (Dispatch_Entry &dispatch_entry,
Time start,
Time stop,
Time arrival,
Time deadline,
TimeLine_Entry *next = 0,
TimeLine_Entry *prev = 0);
// dispatch entry accessor
Dispatch_Entry &dispatch_entry () const;
// accessors for time slice start and stop times (100 nanoseconds)
Time start () const;
Time stop () const;
Time arrival () const;
Time deadline () const;
// accessor and mutator for next and prev slices for this dispatch
TimeLine_Entry *next (void) const;
void next (TimeLine_Entry *);
TimeLine_Entry *prev (void) const;
void prev (TimeLine_Entry *);
int operator < (const TimeLine_Entry&) const;
private:
// the dispatch entry to which the time slice corresponds
Dispatch_Entry &dispatch_entry_;
// priority time slice times (100 nanoseconds)
Time start_;
Time stop_;
Time arrival_;
Time deadline_;
// next and previous priority time slices for this dispatch entry
TimeLine_Entry *next_;
TimeLine_Entry *prev_;
};
class TAO_RTSched_Export TimeLine_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;
TimeLine_Entry_Link (TimeLine_Entry &t);
// ctor
TimeLine_Entry &entry () const;
// accessor for the underlying entry
int operator < (const TimeLine_Entry_Link&) const;
// comparison operator
private:
TimeLine_Entry &entry_;
// the underlying entry
};
#if defined (__ACE_INLINE__)
#include "SchedEntry.i"
#endif /* __ACE_INLINE__ */
#include /**/ "ace/post.h"
#endif /* SCHEDENTRY_H */
// EOF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -