/home/aherms/Code/git/awds-routing/src/awds/CancelTimer.h

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         //      GEA.dbg() << "timeout happend for " << self << std::endl;
00043         
00044         if (self->state == Active) {
00045             self->callback( self, self->data);
00046             self->state = Fired;
00047             //GEA.dbg() << "calling timout callback" << std::endl;
00048         }
00049         // wo wird das Object gelöscht?
00050     }
00051 
00052 public:
00053     void cancel() {
00054         
00055         //      GEA.dbg() << "timer " << this << " canceled" << std::endl;
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; // unlink
00086                 delete current;       // and remove
00087             }
00088             *prev = (*prev)->next;
00089         }
00090     }
00091     
00092 };
00093 
00094 }
00095 
00096 #endif //CANCELTIMER_H__
00097 /* This stuff is for emacs
00098  * Local variables:
00099  * mode:c++
00100  * c-basic-offset: 4
00101  * End:
00102  */

Generated on Tue Dec 11 17:58:47 2007 for AWDS by  doxygen 1.5.3-20071008