00001 // -*- c-basic-offset: 4; related-file-name: "../../lib/timer.cc" -*- 00002 #ifndef CLICK_TIMER_HH 00003 #define CLICK_TIMER_HH 00004 #include <click/sync.hh> 00005 #include <click/glue.hh> 00006 #include <click/element.hh> 00007 #include <click/timestamp.hh> 00008 CLICK_DECLS 00009 class RouterThread; 00010 00011 typedef void (*TimerCallback)(Timer *timer, void *user_data); 00012 typedef TimerCallback TimerHook CLICK_DEPRECATED; 00013 00014 class Timer { public: 00015 00022 Timer(); 00023 00024 struct do_nothing_t { 00025 }; 00026 00032 Timer(const do_nothing_t &unused); 00033 00038 Timer(TimerCallback f, void *user_data); 00039 00043 Timer(Element *element); 00044 00047 Timer(Task *task); 00048 00052 Timer(const Timer &x); 00053 00055 inline ~Timer() { 00056 if (scheduled()) 00057 unschedule(); 00058 } 00059 00060 00062 inline void assign() { 00063 _hook.callback = do_nothing_hook; 00064 _thunk = (void *) 1; 00065 } 00066 00068 inline void assign(const do_nothing_t &unused) { 00069 (void) unused; 00070 assign(); 00071 } 00072 00076 inline void assign(TimerCallback f, void *user_data) { 00077 _hook.callback = f; 00078 _thunk = user_data; 00079 } 00080 00084 void assign(Element *element) { 00085 _hook.callback = element_hook; 00086 _thunk = element; 00087 } 00088 00091 void assign(Task *task) { 00092 _hook.callback = task_hook; 00093 _thunk = task; 00094 } 00095 00096 00098 inline bool initialized() const { 00099 return _owner != 0; 00100 } 00101 00103 inline bool scheduled() const { 00104 return _schedpos1 != 0; 00105 } 00106 00107 00116 inline const Timestamp &expiry_steady() const { 00117 return _expiry_s; 00118 } 00119 00131 inline Timestamp expiry() const { 00132 if (_expiry_s) 00133 return _expiry_s + Timestamp::recent() - Timestamp::recent_steady(); 00134 else 00135 return _expiry_s; 00136 } 00137 00139 inline Router *router() const { 00140 return _owner->router(); 00141 } 00142 00144 inline Element *element() const { 00145 return _owner; 00146 } 00147 00149 inline RouterThread *thread() const { 00150 return _thread; 00151 } 00152 00154 int home_thread_id() const; 00155 00156 00171 void initialize(Element *owner, bool quiet = false); 00172 00181 void initialize(Router *router); 00182 00183 00191 void schedule_at_steady(const Timestamp &when_steady); 00192 00197 void reschedule_at_steady(const Timestamp &when_steady); 00198 00210 inline void schedule_at(const Timestamp &when); 00211 00216 inline void reschedule_at(const Timestamp &when); 00217 00221 inline void schedule_now() { 00222 schedule_at_steady(Timestamp::recent_steady()); 00223 } 00224 00233 void schedule_after(const Timestamp &delta); 00234 00239 inline void schedule_after_sec(uint32_t delta_sec) { 00240 schedule_after(Timestamp(delta_sec, 0)); 00241 } 00242 00247 inline void schedule_after_msec(uint32_t delta_msec) { 00248 schedule_after(Timestamp::make_msec(delta_msec)); 00249 } 00250 00259 inline void reschedule_after(const Timestamp &delta) { 00260 schedule_at_steady(_expiry_s + delta); 00261 } 00262 00268 inline void reschedule_after_sec(uint32_t delta_sec) { 00269 schedule_at_steady(Timestamp(_expiry_s.sec() + delta_sec, _expiry_s.subsec())); 00270 } 00271 00277 inline void reschedule_after_msec(uint32_t delta_msec) { 00278 schedule_at_steady(_expiry_s + Timestamp::make_msec(delta_msec)); 00279 } 00280 00281 00285 void unschedule(); 00286 00288 inline void clear() { 00289 unschedule(); 00290 _expiry_s = Timestamp(); 00291 } 00292 00293 00304 static inline Timestamp adjustment() { 00305 #if TIMESTAMP_WARPABLE 00306 if (Timestamp::warp_jumping()) 00307 return Timestamp(); 00308 #endif 00309 return Timestamp::make_usec(500); 00310 } 00311 00312 00317 inline void schedule_after_s(uint32_t delta_sec) CLICK_DEPRECATED; 00318 00323 inline void schedule_after_ms(uint32_t delta_sec) CLICK_DEPRECATED; 00324 00329 inline void reschedule_after_s(uint32_t delta_sec) CLICK_DEPRECATED; 00330 00335 inline void reschedule_after_ms(uint32_t delta_sec) CLICK_DEPRECATED; 00336 00337 enum { behind_sec = 1 }; 00338 00339 private: 00340 00341 int _schedpos1; 00342 Timestamp _expiry_s; 00343 union { 00344 TimerCallback callback; 00345 } _hook; 00346 void *_thunk; 00347 Element *_owner; 00348 RouterThread *_thread; 00349 00350 Timer &operator=(const Timer &x); 00351 00352 static void do_nothing_hook(Timer *t, void *user_data); 00353 static void element_hook(Timer *t, void *user_data); 00354 static void task_hook(Timer *t, void *user_data); 00355 00356 friend class TimerSet; 00357 00358 }; 00359 00360 inline void 00361 Timer::schedule_at(const Timestamp &when) 00362 { 00363 schedule_at_steady(when + Timestamp::recent_steady() - Timestamp::recent()); 00364 } 00365 00366 inline void 00367 Timer::reschedule_at(const Timestamp &when) 00368 { 00369 schedule_at(when); 00370 } 00371 00372 inline void 00373 Timer::schedule_after_s(uint32_t delta_sec) 00374 { 00375 schedule_after_sec(delta_sec); 00376 } 00377 00378 inline void 00379 Timer::schedule_after_ms(uint32_t delta_msec) 00380 { 00381 schedule_after_msec(delta_msec); 00382 } 00383 00384 inline void 00385 Timer::reschedule_after_s(uint32_t delta_sec) 00386 { 00387 reschedule_after_sec(delta_sec); 00388 } 00389 00390 inline void 00391 Timer::reschedule_after_ms(uint32_t delta_msec) 00392 { 00393 reschedule_after_msec(delta_msec); 00394 } 00395 00396 CLICK_ENDDECLS 00397 #endif
1.5.6