ucommon

ucommon/timers.h

Go to the documentation of this file.
00001 // Copyright (C) 2006-2010 David Sugar, Tycho Softworks.
00002 //
00003 // This file is part of GNU uCommon C++.
00004 //
00005 // GNU uCommon C++ is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU Lesser General Public License as published
00007 // by the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // GNU uCommon C++ is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public License
00016 // along with GNU uCommon C++.  If not, see <http://www.gnu.org/licenses/>.
00017 
00027 #ifndef _UCOMMON_TIMERS_H_
00028 #define _UCOMMON_TIMERS_H_
00029 
00030 #ifndef _UCOMMON_LINKED_H_
00031 #include <ucommon/linked.h>
00032 #endif
00033 
00034 #ifndef _MSWINDOWS_
00035 #include <unistd.h>
00036 #include <sys/time.h>
00037 #endif
00038 
00039 #include <time.h>
00040 
00041 NAMESPACE_UCOMMON
00042 
00049 class __EXPORT Timer
00050 {
00051 private:
00052     friend class Conditional;
00053     friend class Semaphore;
00054     friend class Event;
00055 
00056 #if _POSIX_TIMERS > 0 && defined(POSIX_TIMERS)
00057     timespec timer;
00058 #else
00059 #undef  POSIX_TIMERS    // make sure not used if no support
00060     timeval timer;
00061 #endif
00062     bool updated;
00063 
00064 public:
00065 #if _MSC_VER > 1400        // windows broken dll linkage issue...
00066     static const timeout_t inf = ((timeout_t)(-1));
00067     static const time_t reset = ((time_t)(0));
00068 #else
00069     static const timeout_t inf; 
00070     static const time_t reset;  
00071 #endif
00072 
00073 #ifdef  _MSWINDOWS_
00074     typedef unsigned __int64 tick_t;
00075 #else
00076     typedef uint64_t tick_t;
00077 #endif
00078 
00082     Timer();
00083 
00088     Timer(timeout_t offset);
00089 
00094     Timer(time_t offset);
00095 
00100     Timer(const Timer& copy);
00101 
00106     bool isExpired(void);
00107 
00112     bool isUpdated(void);
00113 
00118     void set(timeout_t expire);
00119 
00124     void set(time_t expire);
00125 
00129     void set(void);
00130 
00134     void clear(void);
00135 
00140     timeout_t get(void) const;
00141 
00146     inline timeout_t operator*() const
00147         {return get();};
00148 
00153     bool operator!() const;
00154 
00159     operator bool() const;
00160 
00165     Timer& operator=(time_t expire);
00166 
00171     Timer& operator=(timeout_t expire);
00172 
00177     Timer& operator+=(time_t expire);
00178 
00183     Timer& operator+=(timeout_t expire);
00184 
00189     Timer& operator-=(time_t expire);
00190 
00195     Timer& operator-=(timeout_t expire);
00196 
00202     timeout_t operator-(const Timer& timer);
00203 
00209     bool operator==(const Timer& timer);
00210 
00216     bool operator!=(const Timer& timer);
00217 
00223     bool operator<(const Timer& timer);
00224 
00230     bool operator<=(const Timer& timer);
00231 
00237     bool operator>(const Timer& timer);
00238 
00244     bool operator>=(const Timer& timer);
00245 
00250     static void sync(Timer &timer);
00251 
00256     static tick_t ticks(void);
00257 };
00258 
00269 class __EXPORT TimerQueue : public OrderedIndex
00270 {
00271 public:
00280     class __EXPORT event : protected Timer, public LinkedList
00281     {
00282     protected:
00283         friend class TimerQueue;
00284 
00289         event(timeout_t expire);
00290 
00296         event(TimerQueue *queue, timeout_t expire);
00297 
00301         virtual void expired(void) = 0;
00302 
00308         virtual timeout_t timeout(void);
00309 
00310     public:
00314         virtual ~event();
00315 
00321         void attach(TimerQueue *queue);
00322 
00326         void detach(void);
00327 
00332         void arm(timeout_t timeout);
00333 
00337         void disarm(void);
00338 
00343         inline bool isExpired(void)
00344             {return Timer::isExpired();};
00345 
00350         inline timeout_t get(void) const
00351             {return Timer::get();};
00352 
00356         void update(void);
00357 
00362         inline TimerQueue *getQueue(void)
00363             {return static_cast<TimerQueue*>(root);};
00364     };
00365 
00366 protected:
00367     friend class event;
00368 
00373     virtual void modify(void) = 0;
00374 
00380     virtual void update(void) = 0;
00381 
00382 public:
00386     TimerQueue();
00387 
00391     virtual ~TimerQueue();
00392 
00397     void operator+=(event &timer);
00398 
00403     void operator-=(event &timer);
00404 
00412     timeout_t expire();
00413 };
00414 
00418 typedef TimerQueue::event TQEvent;
00419 
00423 typedef Timer timer_t;
00424 
00425 END_NAMESPACE
00426 
00427 extern "C" {
00428 #if defined(WIN32)
00429     __EXPORT int gettimeofday(struct timeval *tv, void *tz);
00430 #endif
00431 }
00432 
00433 #endif