00001 #ifndef _CANCELTIMER_H__
00002 #define _CANCELTIMER_H__
00003
00004 #include <gea/API.h>
00005 #include <gea/Blocker.h>
00006
00007 namespace awds {
00008
00009 class CancelTimer {
00010
00011 friend class CancelTimerManager;
00012 protected:
00013 CancelTimer *next;
00014
00015 gea::Blocker blocker;
00016
00017 typedef void (*callback_t)( CancelTimer *timer, void *data);
00018
00019 callback_t callback;
00020 void *data;
00021
00022 enum State {
00023 Active,
00024 Canceled,
00025 Fired
00026 };
00027
00028 enum State state;
00029
00030 void startTimer(gea::AbsTime timeout, callback_t callback, void *data) {
00031 this->callback = callback;
00032 this->data = data;
00033 this->state = Active;
00034 GEA.waitFor(&blocker, timeout, timeout_func, this);
00035 }
00036
00037
00038 static void timeout_func(gea::Handle *h, gea::AbsTime t, void *self_p) {
00039
00040 CancelTimer *self = static_cast<CancelTimer *>(self_p);
00041
00042
00043
00044 if (self->state == Active) {
00045 self->callback( self, self->data);
00046 self->state = Fired;
00047
00048 }
00049
00050 }
00051
00052 public:
00053 void cancel() {
00054
00055
00056
00057 this->state = Canceled;
00058 }
00059 };
00060
00061 class CancelTimerManager {
00062 CancelTimer *head;
00063
00064 public:
00065 CancelTimerManager() {
00066 head = 0;
00067 }
00068
00069 CancelTimer *startTimer(gea::AbsTime timeout, CancelTimer::callback_t callback, void *data) {
00070 CancelTimer *ct = new CancelTimer;
00071 ct->next = this->head;
00072 this->head = ct;
00073 ct->startTimer(timeout, callback, data);
00074 cleanUp();
00075 return ct;
00076 }
00077
00078 void cleanUp() {
00079
00080 CancelTimer *current;
00081 CancelTimer **prev = &head;
00082
00083 while( (current = *prev) != 0 ) {
00084 if (current->state != CancelTimer::Active) {
00085 *prev = current->next;
00086 delete current;
00087 }
00088 *prev = (*prev)->next;
00089 }
00090 }
00091
00092 };
00093
00094 }
00095
00096 #endif //CANCELTIMER_H__
00097
00098
00099
00100
00101
00102