00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00047 #ifndef _PROTLIB__TIMER_H_
00048 #define _PROTLIB__TIMER_H_
00049
00050 #include <pthread.h>
00051 #include <sys/time.h>
00052 #include <list>
00053 #include <ext/hash_map>
00054
00055 #include "protlib_types.h"
00056 #include "llhashers.h"
00057
00058 namespace protlib {
00059
00064
00065
00066 typedef uint64 timer_id_t;
00067
00069 typedef void* timer_callback_param_t;
00070
00072
00075 class TimerCallback {
00076 public:
00077 virtual ~TimerCallback() { }
00078
00080
00083 virtual void timer_expired(timer_id_t id, timer_callback_param_t param) = 0;
00084 };
00085
00087
00088 class TimerManager {
00089 public:
00091 TimerManager();
00093 ~TimerManager();
00095 timer_id_t start_relative(TimerCallback* tc, int32 sec, int32 msec = 0, timer_callback_param_t tcp = NULL);
00097 timer_id_t start_absolute(TimerCallback* tc, int32 sec, int32 msec = 0, timer_callback_param_t tcp = NULL);
00099 bool restart_relative(timer_id_t id, int32 sec, int32 msec = 0);
00101 bool restart_absolute(timer_id_t id, int32 sec, int32 msec = 0);
00103 bool stop(timer_id_t id);
00105 uint32 check_timers();
00107 uint32 check_timers_wait(int32 msec);
00109 uint32 stop_all();
00110 private:
00112 struct timer {
00113 timer_id_t id;
00114 struct timespec time;
00115 TimerCallback* callback;
00116 timer_callback_param_t param;
00117 timer(struct timespec& ts, TimerCallback* tc, timer_callback_param_t tcp, bool get_id = true);
00118
00119 bool operator<=(const timer& t);
00121 void do_callback();
00123 static timer_id_t next_id;
00124 };
00126 typedef hash_map<timer_id_t,timer*> timer_hashmap_t;
00128 typedef timer_hashmap_t::iterator timer_hashmap_it_t;
00130 typedef list<timer*> timerlist_t;
00131
00133 uint32 cleanup();
00135 void insert_into_list(timer* t);
00137 void delete_from_list(timer *t);
00139 timer* collect_elapsed();
00141 uint32 process_elapsed();
00143 pthread_mutex_t mutex;
00145 pthread_mutexattr_t mutex_attr;
00146
00148 pthread_cond_t cond;
00150 timerlist_t active_timerlist;
00152 timerlist_t elapsed_timerlist;
00154 timer* first() { return active_timerlist.empty() ? 0 : active_timerlist.front(); }
00155 timer_hashmap_t hashmap;
00156 };
00157
00159
00160 }
00161
00162 #endif // _PROTLIB__TIMER_H_