00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef ACE_TIMER_WHEEL_T_H
00014 #define ACE_TIMER_WHEEL_T_H
00015 #include "ace/pre.h"
00016
00017 #include "ace/Timer_Queue_T.h"
00018
00019 #if !defined (ACE_LACKS_PRAGMA_ONCE)
00020 # pragma once
00021 #endif
00022
00023
00024 template <class TYPE, class FUNCTOR, class ACE_LOCK>
00025 class ACE_Timer_Wheel_T;
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 template <class TYPE, class FUNCTOR, class ACE_LOCK>
00037 class ACE_Timer_Wheel_Iterator_T
00038 : public ACE_Timer_Queue_Iterator_T <TYPE, FUNCTOR, ACE_LOCK>
00039 {
00040 public:
00041 typedef ACE_Timer_Wheel_T<TYPE, FUNCTOR, ACE_LOCK> Wheel;
00042 typedef ACE_Timer_Node_T<TYPE> Node;
00043
00044
00045 ACE_Timer_Wheel_Iterator_T (Wheel &);
00046
00047
00048 ~ACE_Timer_Wheel_Iterator_T (void);
00049
00050
00051 virtual void first (void);
00052
00053
00054 virtual void next (void);
00055
00056
00057 virtual int isdone (void) const;
00058
00059
00060 virtual ACE_Timer_Node_T<TYPE>* item (void);
00061
00062 protected:
00063
00064 Wheel& timer_wheel_;
00065
00066
00067 u_int spoke_;
00068
00069
00070 ACE_Timer_Node_T<TYPE>* current_node_;
00071 private:
00072 void goto_next(u_int start_spoke);
00073 };
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089 template <class TYPE, class FUNCTOR, class ACE_LOCK>
00090 class ACE_Timer_Wheel_T : public ACE_Timer_Queue_T<TYPE, FUNCTOR, ACE_LOCK>
00091 {
00092 public:
00093
00094 typedef ACE_Timer_Wheel_Iterator_T<TYPE, FUNCTOR, ACE_LOCK> Iterator;
00095
00096 friend class ACE_Timer_Wheel_Iterator_T<TYPE, FUNCTOR, ACE_LOCK>;
00097 typedef ACE_Timer_Node_T<TYPE> Node;
00098
00099 typedef ACE_Timer_Queue_T<TYPE, FUNCTOR, ACE_LOCK> Base;
00100 typedef ACE_Free_List<Node> FreeList;
00101
00102
00103 ACE_Timer_Wheel_T (FUNCTOR* upcall_functor = 0, FreeList* freelist = 0);
00104
00105
00106 ACE_Timer_Wheel_T (u_int spoke_count,
00107 u_int resolution,
00108 size_t prealloc = 0,
00109 FUNCTOR* upcall_functor = 0,
00110 FreeList* freelist = 0);
00111
00112
00113 virtual ~ACE_Timer_Wheel_T (void);
00114
00115
00116 virtual int is_empty (void) const;
00117
00118
00119
00120 virtual const ACE_Time_Value& earliest_time (void) const;
00121
00122
00123 virtual long schedule (const TYPE& type,
00124 const void* act,
00125 const ACE_Time_Value& future_time,
00126 const ACE_Time_Value& interval
00127 = ACE_Time_Value::zero);
00128
00129
00130
00131 virtual int reset_interval (long timer_id,
00132 const ACE_Time_Value& interval);
00133
00134
00135
00136
00137 virtual int cancel (const TYPE& type,
00138 int dont_call_handle_close = 1);
00139
00140
00141
00142
00143 virtual int cancel (long timer_id,
00144 const void** act = 0,
00145 int dont_call_handle_close = 1);
00146
00147
00148
00149
00150 virtual int expire (void);
00151
00152
00153
00154
00155 int expire (const ACE_Time_Value&);
00156
00157
00158 virtual ACE_Timer_Queue_Iterator_T<TYPE, FUNCTOR, ACE_LOCK>& iter (void);
00159
00160
00161 virtual ACE_Timer_Node_T<TYPE>* remove_first (void);
00162
00163
00164 virtual void dump (void) const;
00165
00166
00167 virtual ACE_Timer_Node_T<TYPE>* get_first (void);
00168
00169 private:
00170
00171 ACE_Timer_Node_T<TYPE>* get_first_i (void) const;
00172 ACE_Timer_Node_T<TYPE>* remove_first_expired (const ACE_Time_Value& now);
00173 void open_i (size_t prealloc, u_int spokes, u_int res);
00174 virtual void reschedule (ACE_Timer_Node_T<TYPE> *);
00175 ACE_Timer_Node_T<TYPE>* find_spoke_node(u_int spoke, long timer_id) const;
00176 ACE_Timer_Node_T<TYPE>* find_node(long timer_id) const;
00177 u_int calculate_spoke(const ACE_Time_Value& expire) const;
00178 long generate_timer_id(u_int spoke);
00179 void schedule_i (ACE_Timer_Node_T<TYPE>* n, u_int spoke, const ACE_Time_Value& expire);
00180 void cancel_i (ACE_Timer_Node_T<TYPE>* n, int skip_close);
00181 void unlink (ACE_Timer_Node_T<TYPE>* n);
00182 void recalc_earliest(const ACE_Time_Value& last);
00183
00184 private:
00185
00186 ACE_Timer_Node_T<TYPE>** spokes_;
00187
00188 u_int spoke_count_;
00189
00190 int spoke_bits_;
00191
00192 u_int max_per_spoke_;
00193
00194 int res_bits_;
00195
00196 u_int earliest_spoke_;
00197
00198 Iterator* iterator_;
00199
00200 ACE_Time_Value wheel_time_;
00201
00202 u_int timer_count_;
00203
00204
00205 ACE_UNIMPLEMENTED_FUNC (
00206 ACE_Timer_Wheel_T (const ACE_Timer_Wheel_T<TYPE, FUNCTOR, ACE_LOCK> &))
00207 ACE_UNIMPLEMENTED_FUNC (
00208 void operator= (const ACE_Timer_Wheel_T<TYPE, FUNCTOR, ACE_LOCK> &))
00209 };
00210
00211 #if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
00212 #if !defined (ACE_HAS_BROKEN_HPUX_TEMPLATES)
00213 #include "ace/Timer_Wheel_T.cpp"
00214 #endif
00215 #endif
00216
00217 #if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
00218 #pragma implementation ("Timer_Wheel_T.cpp")
00219 #endif
00220
00221 #include "ace/post.h"
00222 #endif