#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
* your object (which you should override) will be called
* at the given time.
*/
-class InspTimer : public Extensible
+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
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 will ensure timers are not missed, as well as removing timers that have
* expired and allowing the addition of new ones.
*/
-class TimerManager : public Extensible
+class CoreExport TimerManager : public Extensible
{
protected:
/** A group of timers all set to trigger at the same time
/** 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
*/
};
#endif
+