summaryrefslogtreecommitdiff
path: root/src/timers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/timers.cpp')
-rw-r--r--src/timers.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/timers.cpp b/src/timers.cpp
new file mode 100644
index 000000000..dada034ec
--- /dev/null
+++ b/src/timers.cpp
@@ -0,0 +1,134 @@
+/* Timer stuff.
+ *
+ * (C) 2003-2009 Anope Team
+ * Contact us at team@anope.org
+ *
+ * Please read COPYING and README for furhter details.
+ * Based on the original code of Epona by Lara.
+ * Based on the original code of Services by Andy Church.
+ *
+ * $Id$
+ *
+ */
+
+#include "timers.h"
+
+std::vector<Timer *> TimerManager::Timers;
+
+/** Default constructor, initializes the triggering time
+ * @param time_from_now The number of seconds from now to trigger the timer
+ * @param now The time now
+ * @param repeating Repeat this timer every time_from_now if this is true
+ */
+Timer::Timer(long time_from_now, time_t now, bool repeating)
+{
+ trigger = now + time_from_now;
+ secs = time_from_now;
+ repeat = repeating;
+
+ TimerManager::AddTimer(this);
+}
+
+/** Default destructor, does nothing
+ */
+Timer::~Timer()
+{
+}
+
+/** Set the trigger time to a new value
+ * @param t The new time
+*/
+void Timer::SetTimer(time_t t)
+{
+ trigger = t;
+}
+
+/** Retrieve the triggering time
+ * @return The trigger time
+ */
+const time_t Timer::GetTimer()
+{
+ return trigger;
+}
+
+/** Returns true if the timer is set to repeat
+ * @return Returns true if the timer is set to repeat
+ */
+const bool Timer::GetRepeat()
+{
+ return repeat;
+}
+
+/** Returns the time this timer was created
+* @return The time this timer was created
+*/
+const time_t Timer::GetSetTime()
+{
+ return settime;
+}
+
+/** Returns the interval between ticks
+* @return The interval
+*/
+const long Timer::GetSecs()
+{
+ return secs;
+}
+
+/** Add a timer to the list
+ * @param T A Timer derived class to add
+ */
+void TimerManager::AddTimer(Timer *T)
+{
+ Timers.push_back(T);
+ sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison);
+}
+
+/** Deletes a timer
+ * @param T A Timer derived class to delete
+ */
+void TimerManager::DelTimer(Timer *T)
+{
+ std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T);
+
+ if (i != Timers.end())
+ {
+ delete (*i);
+ Timers.erase(i);
+ }
+}
+
+/** Tick all pending timers
+ * @param time The current time
+ */
+void TimerManager::TickTimers(time_t ctime)
+{
+ std::vector<Timer *>::iterator i;
+ Timer *t;
+
+ while ((Timers.size()) && (ctime > (*Timers.begin())->GetTimer()))
+ {
+ i = Timers.begin();
+
+ t = *i;
+
+ t->Tick(ctime);
+
+ Timers.erase(i);
+
+ if (t->GetRepeat())
+ {
+ t->SetTimer(ctime + t->GetSecs());
+ AddTimer(t);
+ }
+ else
+ delete t;
+ }
+}
+
+/** Compares two timers
+ */
+bool TimerManager::TimerComparison(Timer *one, Timer *two)
+{
+ return (one->GetTimer() < two->GetTimer());
+}