00001
00002
00003
00004
00005
00006
00007
00008 #ifndef IBRCOMMON_TIMER_H_
00009 #define IBRCOMMON_TIMER_H_
00010
00011 #include "ibrcommon/thread/Thread.h"
00012 #include "ibrcommon/thread/Conditional.h"
00013 #include <map>
00014 #include <set>
00015
00016 #include <string>
00017 #include <iostream>
00018
00019 namespace ibrcommon
00020 {
00021 class Timer;
00022 class TimerCallback
00023 {
00024 public:
00030 virtual bool timeout(Timer *timer) = 0;
00031 };
00032
00033 class SimpleTimerCallback
00034 {
00035 public:
00041 virtual size_t timeout(size_t identifier) = 0;
00042 };
00043
00044 class Timer : public JoinableThread
00045 {
00046 public:
00047 static size_t get_current_time();
00048
00053 Timer(TimerCallback &callback, size_t timeout);
00054
00055 virtual ~Timer();
00056
00057 void set(size_t timeout);
00058
00062 void reset();
00063
00064 void stop();
00065
00066 protected:
00067 void run();
00068
00069 private:
00070 enum TIMER_STATE
00071 {
00072 TIMER_UNSET = 0,
00073 TIMER_RUNNING = 1,
00074 TIMER_RESET = 2,
00075 TIMER_STOPPED = 3
00076 };
00077
00078 StatefulConditional<Timer::TIMER_STATE, TIMER_STOPPED> _state;
00079 TimerCallback &_callback;
00080 size_t _timeout;
00081 };
00082
00083 class SimpleTimer : public JoinableThread
00084 {
00085 public:
00086 SimpleTimer(SimpleTimerCallback &callback, size_t identifier);
00087 virtual ~SimpleTimer();
00088
00089 void set(size_t timeout);
00090 void remove();
00091
00092 protected:
00093 void run();
00094
00095 private:
00096 SimpleTimerCallback &_callback;
00097 size_t _identifier;
00098 size_t _countdown;
00099 ibrcommon::Conditional _timecond;
00100
00101 bool _running;
00102 };
00103
00104 class MultiTimer : public JoinableThread
00105 {
00106 public:
00107 MultiTimer();
00108 virtual ~MultiTimer();
00109
00110 void set(SimpleTimerCallback &callback, size_t identifier, size_t timeout);
00111 void remove(SimpleTimerCallback &callback, size_t identifier);
00112
00113 void removeAll();
00114
00115 protected:
00116 void run();
00117
00118 private:
00119 class Eggtimer
00120 {
00121 public:
00122 Eggtimer(SimpleTimerCallback &callback, size_t identifier, size_t timeout);
00123 ~Eggtimer();
00124
00125 bool operator>(const Eggtimer &obj) const;
00126 bool operator<(const Eggtimer &obj) const;
00127 bool operator>(const size_t &obj) const;
00128 bool operator<(const size_t &obj) const;
00129
00130 bool operator==(const Eggtimer &obj) const;
00131
00132 SimpleTimerCallback &_callback;
00133 size_t _timeout;
00134 size_t _identifier;
00135
00136 const std::string toString() const;
00137 };
00138
00139 ibrcommon::Mutex _listlock;
00140 std::multiset<Eggtimer> _timers;
00141 ibrcommon::Conditional _timecond;
00142
00143 bool _running;
00144 };
00145 }
00146
00147 #endif