]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/timer.h
OOPS! We try again, since I'm smoking craq. LF is 0x0a NOT CR.
[user/henk/code/inspircd.git] / include / timer.h
index ad4f5ef8760b0cfadb7dd7b66734a78f2ec45fc6..ef8b82e31f64d728d662c35769af20842e162a9a 100644 (file)
@@ -1 +1,156 @@
-/*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#ifndef INSPIRCD_TIMER_H\r#define INSPIRCD_TIMER_H\r\rclass InspIRCd;\r\r/** Timer class for one-second resolution timers\r * InspTimer provides a facility which allows module\r * developers to create one-shot timers. The timer\r * can be made to trigger at any time up to a one-second\r * resolution. To use InspTimer, inherit a class from\r * InspTimer, then insert your inherited class into the\r * queue using Server::AddTimer(). The Tick() method of\r * your object (which you should override) will be called\r * at the given time.\r */\rclass CoreExport InspTimer : public Extensible\r{\r private:\r        /** The triggering time\r         */\r    time_t trigger;\r        /** Number of seconds between triggers\r  */\r    long secs;\r     /** True if this is a repeating timer\r   */\r    bool repeat;\r public:\r  /** Default constructor, initializes the triggering time\r        * @param secs_from_now The number of seconds from now to trigger the timer\r     * @param now The time now\r      * @param repeating Repeat this timer every secs_from_now seconds if set to true\r        */\r    InspTimer(long secs_from_now,time_t now, bool repeating = false)\r       {\r              trigger = now + secs_from_now;\r         secs = secs_from_now;\r          repeat = repeating;\r    }\r\r     /** Default destructor, does nothing.\r   */\r    virtual ~InspTimer() { }\r\r      /** Retrieve the current triggering time\r        */\r    virtual time_t GetTimer()\r      {\r              return trigger;\r        }\r\r     /** Called when the timer ticks.\r        * You should override this method with some useful code to\r     * handle the tick event.\r       */\r    virtual void Tick(time_t TIME) = 0;\r\r   /** Returns true if this timer is set to repeat\r         */\r    bool GetRepeat()\r       {\r              return repeat;\r }\r\r     /** Returns the interval (number of seconds between ticks)\r      * of this timer object.\r        */\r    long GetSecs()\r {\r              return secs;\r   }\r\r     /** Cancels the repeat state of a repeating timer.\r      * If you call this method, then the next time your\r     * timer ticks, it will be removed immediately after.\r   * You should use this method call to remove a recurring\r        * timer if you wish to do so within the timer's Tick\r   * event, as calling TimerManager::DelTimer() from within\r       * the InspTimer::Tick() method is dangerous and may\r    * cause a segmentation fault. Calling CancelRepeat()\r   * is safe in this case.\r        */\r    void CancelRepeat()\r    {\r              repeat = false;\r        }\r};\r\r\r/** This class manages sets of InspTimers, and triggers them at their defined times.\r * This will ensure timers are not missed, as well as removing timers that have\r * expired and allowing the addition of new ones.\r */\rclass CoreExport TimerManager : public Extensible\r{\r protected:\r      /** A group of timers all set to trigger at the same time\r       */\r    typedef std::vector<InspTimer*> timergroup;\r    /** A map of timergroups, each group has a specific trigger time\r        */\r    typedef std::map<time_t, timergroup*> timerlist;\r       /** Set when ticking timers, to prevent deletion while iterating\r        */\r    bool CantDeleteHere;\r   /** Creating server instance\r    */\r    InspIRCd* ServerInstance;\r private:\r\r   /** The current timer set, a map of timergroups\r         */\r    timerlist Timers;\r\r public:\r    /** Constructor\r         */\r    TimerManager(InspIRCd* Instance);\r      /** Tick all pending InspTimers\r         * @param TIME the current system time\r  */\r    void TickTimers(time_t TIME);\r  /** Add an InspTimer\r    * @param T an InspTimer derived class to add\r   * @param secs_from_now You may set this to the number of seconds\r       * from the current time when the timer will tick, or you may just\r      * leave this unset and the values set by the InspTimers constructor\r    * will be used. This is used internally for re-triggering repeating\r    * timers.\r      */\r    void AddTimer(InspTimer* T, long secs_from_now = 0);\r   /** Delete an InspTimer\r         * @param T an InspTimer derived class to delete\r        */\r    void DelTimer(InspTimer* T);\r   /** Tick any timers that have been missed due to lag\r    * @param TIME the current system time\r  */\r    void TickMissedTimers(time_t TIME);\r};\r\r#endif\r\r
\ No newline at end of file
+/*       +------------------------------------+
+ *       | Inspire Internet Relay Chat Daemon |
+ *       +------------------------------------+
+ *
+ *  InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ *            the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
+#ifndef INSPIRCD_TIMER_H
+#define INSPIRCD_TIMER_H
+
+class InspIRCd;
+
+/** Timer class for one-second resolution timers
+ * InspTimer provides a facility which allows module
+ * developers to create one-shot timers. The timer
+ * can be made to trigger at any time up to a one-second
+ * resolution. To use InspTimer, inherit a class from
+ * InspTimer, then insert your inherited class into the
+ * queue using Server::AddTimer(). The Tick() method of
+ * your object (which you should override) will be called
+ * at the given time.
+ */
+class CoreExport InspTimer : public Extensible
+{
+ private:
+       /** The triggering time
+        */
+       time_t trigger;
+       /** Number of seconds between triggers
+        */
+       long secs;
+       /** True if this is a repeating timer
+        */
+       bool repeat;
+ public:
+       /** Default constructor, initializes the triggering time
+        * @param secs_from_now The number of seconds from now to trigger the timer
+        * @param now The time now
+        * @param repeating Repeat this timer every secs_from_now seconds if set to true
+        */
+       InspTimer(long secs_from_now,time_t now, bool repeating = false)
+       {
+               trigger = now + secs_from_now;
+               secs = secs_from_now;
+               repeat = repeating;
+       }
+
+       /** Default destructor, does nothing.
+        */
+       virtual ~InspTimer() { }
+
+       /** Retrieve the current triggering time
+        */
+       virtual time_t GetTimer()
+       {
+               return trigger;
+       }
+
+       /** Called when the timer ticks.
+        * You should override this method with some useful code to
+        * handle the tick event.
+        */
+       virtual void Tick(time_t TIME) = 0;
+
+       /** Returns true if this timer is set to repeat
+        */
+       bool GetRepeat()
+       {
+               return repeat;
+       }
+
+       /** Returns the interval (number of seconds between ticks)
+        * of this timer object.
+        */
+       long GetSecs()
+       {
+               return secs;
+       }
+
+       /** Cancels the repeat state of a repeating timer.
+        * If you call this method, then the next time your
+        * timer ticks, it will be removed immediately after.
+        * You should use this method call to remove a recurring
+        * timer if you wish to do so within the timer's Tick
+        * event, as calling TimerManager::DelTimer() from within
+        * the InspTimer::Tick() method is dangerous and may
+        * cause a segmentation fault. Calling CancelRepeat()
+        * is safe in this case.
+        */
+       void CancelRepeat()
+       {
+               repeat = false;
+       }
+};
+
+
+/** This class manages sets of InspTimers, and triggers them at their defined times.
+ * This will ensure timers are not missed, as well as removing timers that have
+ * expired and allowing the addition of new ones.
+ */
+class CoreExport TimerManager : public Extensible
+{
+ protected:
+       /** A group of timers all set to trigger at the same time
+        */
+       typedef std::vector<InspTimer*> timergroup;
+       /** A map of timergroups, each group has a specific trigger time
+        */
+       typedef std::map<time_t, timergroup*> timerlist;
+       /** Set when ticking timers, to prevent deletion while iterating
+        */
+       bool CantDeleteHere;
+       /** Creating server instance
+        */
+       InspIRCd* ServerInstance;
+ private:
+
+       /** The current timer set, a map of timergroups
+        */
+       timerlist Timers;
+
+ public:
+       /** Constructor
+        */
+       TimerManager(InspIRCd* Instance);
+       /** Tick all pending InspTimers
+        * @param TIME the current system time
+        */
+       void TickTimers(time_t TIME);
+       /** Add an InspTimer
+        * @param T an InspTimer derived class to add
+        * @param secs_from_now You may set this to the number of seconds
+        * from the current time when the timer will tick, or you may just
+        * leave this unset and the values set by the InspTimers constructor
+        * will be used. This is used internally for re-triggering repeating
+        * timers.
+        */
+       void AddTimer(InspTimer* T, long secs_from_now = 0);
+       /** Delete an InspTimer
+        * @param T an InspTimer derived class to delete
+        */
+       void DelTimer(InspTimer* T);
+       /** Tick any timers that have been missed due to lag
+        * @param TIME the current system time
+        */
+       void TickMissedTimers(time_t TIME);
+};
+
+#endif
+