ACE 8.0.1
|
Provides a Timing Wheel version of ACE_Timer_Queue. More...
#include <Timer_Wheel_T.h>
Public Types | |
typedef ACE_Timer_Wheel_Iterator_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY > | Iterator |
Type of iterator. | |
typedef ACE_Timer_Node_T< TYPE > | Node |
typedef ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY > | Base_Timer_Queue |
Type inherited from. | |
typedef ACE_Free_List< Node > | FreeList |
![]() | |
typedef TIME_POLICY | time_policy_t |
Type of time policy. | |
![]() | |
typedef ACE_Timer_Queue_Iterator_T< TYPE > | ITERATOR |
Type of Iterator. | |
Protected Member Functions | |
virtual long | schedule_i (const TYPE &type, const void *act, const ACE_Time_Value &future_time, const ACE_Time_Value &interval) |
Schedules a timer. | |
![]() | |
virtual ACE_Timer_Node_T< TYPE > * | alloc_node () |
Factory method that allocates a new node. | |
virtual void | free_node (ACE_Timer_Node_T< TYPE > *) |
Factory method that frees a previously allocated node. | |
virtual int | dispatch_info_i (const ACE_Time_Value ¤t_time, ACE_Timer_Node_Dispatch_Info_T< TYPE > &info) |
Non-locking version of dispatch_info () | |
void | recompute_next_abs_interval_time (ACE_Timer_Node_T< TYPE > *expired, const ACE_Time_Value &cur_time) |
Recompute when the next time is that this interval timer should fire. | |
Private Member Functions | |
ACE_Timer_Node_T< TYPE > * | get_first_i () const |
ACE_Timer_Node_T< TYPE > * | remove_first_expired (const ACE_Time_Value &now) |
void | open_i (size_t prealloc, u_int spokes, u_int res) |
virtual void | reschedule (ACE_Timer_Node_T< TYPE > *) |
ACE_Timer_Node_T< TYPE > * | find_spoke_node (u_int spoke, long timer_id) const |
Searches for a node by timer_id within one spoke. | |
ACE_Timer_Node_T< TYPE > * | find_node (long timer_id) const |
u_int | calculate_spoke (const ACE_Time_Value &expire) const |
long | generate_timer_id (u_int spoke) |
void | schedule_i (ACE_Timer_Node_T< TYPE > *n, u_int spoke, const ACE_Time_Value &expire) |
The shared scheduling functionality between schedule() and reschedule() | |
void | cancel_i (ACE_Timer_Node_T< TYPE > *n) |
Shared subset of the two cancel() methods. | |
void | unlink (ACE_Timer_Node_T< TYPE > *n) |
void | recalc_earliest (const ACE_Time_Value &last) |
int | power2bits (int n, int min_bits, int max_bits) |
Private Attributes | |
ACE_Timer_Node_T< TYPE > ** | spokes_ |
Timing Wheel. | |
u_int | spoke_count_ |
Size of the timing wheel. | |
int | spoke_bits_ |
Number of timer_id bits used for the spoke. | |
int | res_bits_ |
Resolution (in microsoconds) of the timing wheel. | |
u_int | earliest_spoke_ |
Index of the list with the earliest time. | |
Iterator * | iterator_ |
Iterator used to expire timers. | |
ACE_Time_Value | wheel_time_ |
The total amount of time in one iteration of the wheel. (resolution * spoke_count) | |
u_int | timer_count_ |
The total number of timers currently scheduled. | |
Friends | |
class | ACE_Timer_Wheel_Iterator_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY > |
Iterator is a friend. | |
Additional Inherited Members | |
![]() | |
ACE_LOCK | mutex_ |
ACE_Free_List< ACE_Timer_Node_T< TYPE > > * | free_list_ |
Class that implements a free list. | |
TIME_POLICY | time_policy_ |
The policy to return the current time of day. | |
bool const | delete_free_list_ |
Flag to delete only if the class created the <free_list_> | |
![]() | |
FUNCTOR * | upcall_functor_ |
Upcall functor. | |
bool const | delete_upcall_functor_ |
To delete or not to delete is the question? | |
Provides a Timing Wheel version of ACE_Timer_Queue.
This implementation uses a hash table of ordered doubly- linked lists of absolute times. The enhancements over the ACE_Timer_List
include adding a free list and the ability to preallocate nodes. Timer Wheel is based on the timing wheel implementation used in Adam M. Costello and George Varghese's paper "Redesigning the BSD Callout and
Timer Facilities" (http://dworkin.wustl.edu/~varghese/PAPERS/newbsd.ps.Z)
typedef ACE_Timer_Queue_T<TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY> ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::Base_Timer_Queue |
Type inherited from.
typedef ACE_Free_List<Node> ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::FreeList |
typedef ACE_Timer_Wheel_Iterator_T<TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY> ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::Iterator |
Type of iterator.
typedef ACE_Timer_Node_T<TYPE> ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::Node |
ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::ACE_Timer_Wheel_T | ( | FUNCTOR * | upcall_functor = 0, |
FreeList * | freelist = 0, | ||
TIME_POLICY const & | time_policy = TIME_POLICY() ) |
Default constructor.
Default Constructor that sets defaults for spoke_count_ and resolution_ and doesn't do any preallocation.
upcall_functor | A pointer to a functor to use instead of the default |
freelist | A pointer to a freelist to use instead of the default |
ACE_Timer_Wheel_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >::ACE_Timer_Wheel_T | ( | u_int | spoke_count, |
u_int | resolution, | ||
size_t | prealloc = 0, | ||
FUNCTOR * | upcall_functor = 0, | ||
FreeList * | freelist = 0, | ||
TIME_POLICY const & | time_policy = TIME_POLICY() ) |
Constructor with opportunities to set the wheelsize and resolution.
Constructor that sets up the timing wheel and also may preallocate some nodes on the free list
spoke_count | The number of lists in the timer wheel |
resolution | The time resolution in milliseconds used by the hashing function |
prealloc | The number of entries to prealloc in the free_list |
upcall_functor | A pointer to a functor to use instead of the default |
freelist | A pointer to a freelist to use instead of the default |
|
virtual |
Destructor.
Destructor just cleans up its memory.
|
private |
Uses a simple hash to find which spoke to use based on when the timer is due to expire. Hopefully the 64bit int operations avoid any overflow problems.
|
virtual |
Cancel all timer associated with type. If dont_call_handle_close is 0 then the <functor> will be invoked. Returns number of timers cancelled.
Goes through every list in the wheel and whenever we find one with the correct type value, we remove it and continue. At the end make sure we reset the earliest time value in case the earliest timers were removed.
type | The value to search for. |
skip_close | If this non-zero, the cancellation method of the functor will not be called for each cancelled timer. |
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
virtual |
Cancels the single timer that is specified by the timer_id. In this case the timer_id is actually a pointer to the node, so we cast it to the node. This can be dangerous if the timer_id is made up (or deleted twice) so we do a little sanity check. Finally we update the earliest time in case the earliest timer was removed.
timer_id | Timer Identifier |
act | Asychronous Completion Token (AKA magic cookie): If this is non-zero, stores the magic cookie of the cancelled timer here. |
skip_close | If this non-zero, the cancellation method of the functor will not be called. |
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
private |
Shared subset of the two cancel() methods.
|
virtual |
Destroy timer queue. Cancels all timers.
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
virtual |
Dump the state of an object.
Dumps out the size of the wheel, the resolution, and the contents of the wheel.
Reimplemented from ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >.
|
virtual |
Returns the time of the earlier node in the ACE_Timer_Wheel. Must be called on a non-empty queue.
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
virtual |
Run the <functor> for all timers whose values are <= <ACE_OS::gettimeofday>. Also accounts for <timer_skew>. Returns the number of timers canceled.
Reimplemented from ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >.
|
virtual |
This is a specialized version of expire that is more suited for the internal data representation.
cur_time | The time to expire timers up to. |
Reimplemented from ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >.
|
private |
Searches all spokes for a node matching the specified timer_id Uses the spoke encoded in the timer_id as a starting place.
|
private |
Searches for a node by timer_id within one spoke.
|
private |
Generates a unique timer_id for the given spoke. It should be pretty fast until the point where the counter overflows. At that time you have to do exhaustive searches within the spoke to ensure that a particular timer id is not already in use. Some optimizations are in place so that this hopefully doesn't have to happen often.
|
virtual |
Reads the earliest node from the queue and returns it.
Returns the earliest node without removing it
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
private |
|
virtual |
True if queue is empty, else false.
Check to see if the wheel is empty
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
virtual |
Returns a pointer to this <ACE_Timer_Queue_T>'s iterator.
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
private |
Initialize the queue. Uses the established members for all needed information.
|
private |
|
private |
There are a few places where we have to figure out which timer will expire next. This method makes the assumption that spokes are always sorted, and that timers are always in the correct spoke determined from their expiration time. The last time is always passed in, even though you can often calculate it as get_first()->get_timer_value().
|
virtual |
Removes the earliest node from the queue and returns it.
Removes the earliest node and then find the new <earliest_spoke_>
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
private |
|
privatevirtual |
Takes an ACE_Timer_Node and inserts it into the correct position in the correct list. Also makes sure to update the earliest time.
n | The timer node to reschedule |
Implements ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >.
|
virtual |
Changes the interval of a timer (and can make it periodic or non periodic by setting it to ACE_Time_Value::zero or not).
Find the timer node by using the id as a pointer. Then use set_interval() on the node to update the interval.
timer_id | The timer identifier |
interval | The new interval |
Implements ACE_Abstract_Timer_Queue< TYPE >.
|
private |
The shared scheduling functionality between schedule() and reschedule()
|
protectedvirtual |
Schedules a timer.
Creates a ACE_Timer_Node_T based on the input parameters. Then inserts the node into the wheel using reschedule (). Then returns a timer_id.
type | The data of the timer node |
act | Asynchronous Completion Token (AKA magic cookie) |
future_time | The time the timer is scheduled for (absolute time) |
interval | If not ACE_Time_Value::zero, then this is a periodic timer and interval is the time period |
Implements ACE_Timer_Queue_T< TYPE, FUNCTOR, ACE_LOCK, TIME_POLICY >.
|
private |
|
friend |
Iterator is a friend.
|
private |
Index of the list with the earliest time.
|
private |
Iterator used to expire timers.
|
private |
Resolution (in microsoconds) of the timing wheel.
|
private |
Number of timer_id bits used for the spoke.
|
private |
Size of the timing wheel.
|
private |
Timing Wheel.
|
private |
The total number of timers currently scheduled.
|
private |
The total amount of time in one iteration of the wheel. (resolution * spoke_count)