/* -*- C++ -*- */ // $Id$ // ============================================================================ // // = LIBRARY // ace // // = FILENAME // Timer_List_T.h // // = AUTHOR // Doug Schmidt // // ============================================================================ #ifndef ACE_TIMER_LIST_T_H #define ACE_TIMER_LIST_T_H #include "ace/pre.h" #include "ace/Timer_Queue_T.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ // Forward declaration. template class ACE_Timer_List_T; template class ACE_Timer_List_Iterator_T : public ACE_Timer_Queue_Iterator_T { // = TITLE // Iterates over an . // // = DESCRIPTION // This is a generic iterator that can be used to visit every // node of a timer queue. public: ACE_Timer_List_Iterator_T (ACE_Timer_List_T &); // Constructor. ~ACE_Timer_List_Iterator_T (void); // Destructor. virtual void first (void); // Positions the iterator at the earliest node in the Timer Queue virtual void next (void); // Positions the iterator at the next node in the Timer Queue virtual int isdone (void); // Returns true when there are no more nodes in the sequence virtual ACE_Timer_Node_T *item (void); // Returns the node at the current position in the sequence protected: ACE_Timer_List_T &timer_list_; // Pointer to the that we are iterating over. ACE_Timer_Node_T *position_; }; template class ACE_Timer_List_T : public ACE_Timer_Queue_T { // = TITLE // Provides a simple implementation of timers. // // = DESCRIPTION // This implementation uses a linked list of absolute times. // Therefore, in the average case, scheduling and canceling // timers is O(N) (where N is the total number of timers) and // expiring timers is O(K) (where K is the total number of timers // that are < the current time of day). // // More clever implementations could use a delta-list, a heap, // or timing wheels, etc. For instance, // is a subclass of that implements a // heap-based callout queue. For most applications, the // will perform substantially faster than the // . public: typedef ACE_Timer_List_Iterator_T LIST_ITERATOR; // Type of iterator friend class ACE_Timer_List_Iterator_T; // Iterator is a friend typedef ACE_Timer_Queue_T INHERITED; // Type inherited from // = Initialization and termination methods. ACE_Timer_List_T (FUNCTOR *upcall_functor = 0, ACE_Free_List > *freelist = 0); // Default constructor. is the instance of the // FUNCTOR to be used by the list. If is 0, a // default FUNCTOR will be created. the freelist of // timer nodes. If 0, then a default freelist will be created. virtual ~ACE_Timer_List_T (void); // Destructor virtual int is_empty (void) const; // True if queue is empty, else false. virtual const ACE_Time_Value &earliest_time (void) const; // Returns the time of the earlier node in the . virtual long schedule (const TYPE &type, const void *act, const ACE_Time_Value &delay, const ACE_Time_Value &interval = ACE_Time_Value::zero); // Schedule that will expire after amount of time, // which is specified in absolute time. If it expires then is // passed in as the value to the . If is != to // then it is used to reschedule the // automatically, using relative time to the current . // This method returns a that uniquely identifies the the // entry in an internal list. This can be used to // cancel the timer before it expires. The cancellation ensures // that are unique up to values of greater than 2 // billion timers. As long as timers don't stay around longer than // this there should be no problems with accidentally deleting the // wrong timer. Returns -1 on failure (which is guaranteed never to // be a valid ). virtual int reset_interval (long timer_id, const ACE_Time_Value &interval); // Resets the interval of the timer represented by to // , which is specified in relative time to the current // . If is equal to // , the timer will become a non-rescheduling // timer. Returns 0 if successful, -1 if not. virtual int cancel (const TYPE &type, int dont_call_handle_close = 1); // Cancel all timer associated with . If is 0 // then the will be invoked. Returns number of timers // cancelled. virtual int cancel (long timer_id, const void **act = 0, int dont_call_handle_close = 1); // Cancel the single timer that matches the value (which // was returned from the method). If act is non-NULL // then it will be set to point to the ``magic cookie'' argument // passed in when the timer was registered. This makes it possible // to free up the memory and avoid memory leaks. If is // 0 then the will be invoked. Returns 1 if cancellation // succeeded and 0 if the wasn't found. virtual ACE_Timer_Queue_Iterator_T &iter (void); // Returns a pointer to this 's iterator. virtual ACE_Timer_Node_T *remove_first (void); // Removes the earliest node from the queue and returns it virtual void dump (void) const; // Dump the state of an object. virtual void reschedule (ACE_Timer_Node_T *); // Reschedule an "interval" . This should be private // but for now it needs to be public for virtual ACE_Timer_Node_T *get_first (void); // Reads the earliest node from the queue and returns it. protected: /* virtual ACE_Timer_Node_T *alloc_node (void); // Factory method that allocates a new node (uses operator new). virtual void free_node (ACE_Timer_Node_T *); // Factory method that frees a previously allocated node (uses // operator delete). */ private: ACE_Timer_Node_T *head_; // Pointer to linked list of . LIST_ITERATOR *iterator_; // Iterator used to expire timers. long timer_id_; // Keeps track of the timer id that uniquely identifies each timer. // This id can be used to cancel a timer via the // method. // = Don't allow these operations for now. ACE_UNIMPLEMENTED_FUNC (ACE_Timer_List_T (const ACE_Timer_List_T &)) ACE_UNIMPLEMENTED_FUNC (void operator= (const ACE_Timer_List_T &)) }; #if defined (ACE_TEMPLATES_REQUIRE_SOURCE) && !defined(ACE_HAS_BROKEN_HPUX_TEMPLATES) #include "ace/Timer_List_T.cpp" #endif /* ACE_TEMPLATES_REQUIRE_SOURCE && !ACE_HAS_BROKEN_HPUX_TEMPLATES */ #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA) #pragma implementation ("Timer_List_T.cpp") #endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */ #include "ace/post.h" #endif /* ACE_TIMER_LIST_T_H */