diff options
Diffstat (limited to 'TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h')
-rw-r--r-- | TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h | 592 |
1 files changed, 0 insertions, 592 deletions
diff --git a/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h b/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h deleted file mode 100644 index 185139ca700..00000000000 --- a/TAO/orbsvcs/orbsvcs/Sched/SchedEntry.h +++ /dev/null @@ -1,592 +0,0 @@ -/* -*- C++ -*- */ -// $Id$ -// -// ============================================================================ -// -// = LIBRARY -// sched -// -// = FILENAME -// SchedEntry.h -// -// = CREATION DATE -// 7 February 1998 -// -// = AUTHOR -// Chris Gill -// -// ============================================================================ - -#if ! defined (SCHEDENTRY_H) -#define SCHEDENTRY_H - -#include "orbsvcs/RtecSchedulerC.h" -#include "orbsvcs/Event_Service_Constants.h" - -////////////////////// -// Helper Functions // -////////////////////// - -// TBD - move this to the ACE class -// Euclid's greatest common divisor algorithm -u_long gcd (u_long x, u_long y); - -// TBD - move this to the ACE class -// calculate the minimum frame size -u_long minimum_frame_size (u_long period1, u_long period2); - -// forward declaration of classes -class Task_Entry; -class Task_Entry_Link; -class Dispatch_Entry; -class Dispatch_Entry_Link; -class Dispatch_Proxy_Iterator; - - -class TAO_ORBSVCS_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 Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type Dependency_Type; - - Dispatch_Entry_Link (Dispatch_Entry &d); - // ctor - - Dispatch_Entry_Link (const Dispatch_Entry_Link &d); - // copy ctor - - ~Dispatch_Entry_Link (); - // dtor - - // TBD - make this a global comparison operator - // instead of a class member function - int operator < (const Dispatch_Entry_Link &d) const; - // LT comparator - - Dispatch_Entry &dispatch_entry () const; - // accessor for reference to dispatch entry - -private: - - Dispatch_Entry &dispatch_entry_; -}; - - -// Wrapper for the RT_Info, which aggregates all its dispatches -class TAO_ORBSVCS_Export Task_Entry -{ -public: - - typedef RtecScheduler::handle_t handle_t; - typedef RtecScheduler::Dependency_Info Dependency_Info; - typedef RtecScheduler::Preemption_Priority Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type Dependency_Type; - - // info for DFS traversal, topological sort of call graph - enum DFS_Status {NOT_VISITED, VISITED, FINISHED}; - - // ctor - Task_Entry (); - - // dtor - ~Task_Entry (); - - // merge dispatches according to info type, update - // relevant scheduling characteristics for this entry. - // Returns 0 if all is well, or -1 if an error occurred - int merge_dispatches ( - ACE_Unbounded_Set <Dispatch_Entry *> &dispatch_entries); - - // get, set pointer to underlying RT_Info - RT_Info *rt_info () const; - void rt_info (RT_Info *info); - - - // get effective period for the task entry - Period effective_period () const; - void effective_period (Period p); - - // set/get time when node was discovered in DFS traversal - void discovered (long l); - long discovered () const; - - // set/get time when node was finished in DFS traversal - void finished (long l); - long finished () const; - - // set/get DFS traversal status of node - void dfs_status (DFS_Status ds); - DFS_Status dfs_status () const; - - // set/get flag indicating whether node is a thread delineator - void is_thread_delineator (int i); - int is_thread_delineator () const; - - // get set of links to Task Entries which this entry calls - ACE_Unbounded_Set <Task_Entry_Link *> & calls (); - - // get set of links to Task Entries which call this entry - ACE_Unbounded_Set <Task_Entry_Link *> & callers (); - - // get set of arrivals in the effective period - ACE_Ordered_MultiSet<Dispatch_Entry_Link> &dispatches (); - - // get the type of Info the entry wraps - Info_Type info_type () const; - - // effective execution time for the task entry - u_long effective_execution_time () const; - -private: - - // prohibit 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 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); - - // perform 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); - - - // 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); - - // pointer to the underlying RT_Info - RT_Info *rt_info_; - - // effective period for the task entry - u_long effective_period_; - - // set of arrivals in the effective period - ACE_Ordered_MultiSet<Dispatch_Entry_Link> dispatches_; - - DFS_Status dfs_status_; - long discovered_; - long finished_; - - // info for identifying threads in the oneway call graph - int is_thread_delineator_; - - // get set of links to Task Entries which this entry calls - ACE_Unbounded_Set <Task_Entry_Link *> calls_; - - // get set of links to Task Entries which call this entry - ACE_Unbounded_Set <Task_Entry_Link *> callers_; -}; - - -class TAO_ORBSVCS_Export Task_Entry_Link -{ -public: - - typedef RtecScheduler::handle_t handle_t; - typedef RtecScheduler::Dependency_Info Dependency_Info; - typedef RtecScheduler::Preemption_Priority Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type 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; - -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_ORBSVCS_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 Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type 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_ORBSVCS_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 Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type 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_ORBSVCS_Export TimeLine_Entry -{ -public: - - typedef RtecScheduler::handle_t handle_t; - typedef RtecScheduler::Dependency_Info Dependency_Info; - typedef RtecScheduler::Preemption_Priority Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type 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_ORBSVCS_Export TimeLine_Entry_Link -{ -public: - - typedef RtecScheduler::handle_t handle_t; - typedef RtecScheduler::Dependency_Info Dependency_Info; - typedef RtecScheduler::Preemption_Priority Preemption_Priority; - typedef RtecScheduler::OS_Priority OS_Priority; - typedef RtecScheduler::Preemption_Subpriority Sub_Priority; - typedef RtecScheduler::RT_Info RT_Info; - typedef RtecScheduler::Time Time; - typedef RtecScheduler::Period Period; - typedef RtecScheduler::Info_Type Info_Type; - typedef RtecScheduler::Dependency_Type 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__ */ - -#endif /* SCHEDENTRY_H */ - -// EOF |