summaryrefslogtreecommitdiff
path: root/src/timer.cpp
diff options
context:
space:
mode:
authorattilamolnar <attilamolnar@hush.com>2013-04-09 23:51:06 +0200
committerattilamolnar <attilamolnar@hush.com>2013-04-21 18:00:09 +0200
commit1638ee61936bc91758be39c3463c6e46d0d655e7 (patch)
tree3ad0357587a58bc3845cb3a328bf3e95fadf2923 /src/timer.cpp
parente9e75e50bc25e67af22dd88b39b12217a553d5cb (diff)
Timer changes and TimerManager enhancements
Timer::Tick() now has a bool return value: if false is returned the timer is deleted using operator delete, otherwise, if it's a repeating timer then it's rescheduled (readded) Timers are removed from the TimerManager automatically at destruction Timers are now stored in a multimap instead of a sorted vector
Diffstat (limited to 'src/timer.cpp')
-rw-r--r--src/timer.cpp53
1 files changed, 26 insertions, 27 deletions
diff --git a/src/timer.cpp b/src/timer.cpp
index a1ee0b488..f098a5e6b 100644
--- a/src/timer.cpp
+++ b/src/timer.cpp
@@ -25,55 +25,54 @@
#include "inspircd.h"
#include "timer.h"
-TimerManager::TimerManager()
+void Timer::SetInterval(time_t newinterval)
{
+ ServerInstance->Timers->DelTimer(this);
+ secs = newinterval;
+ SetTrigger(ServerInstance->Time() + newinterval);
+ ServerInstance->Timers->AddTimer(this);
}
-TimerManager::~TimerManager()
+Timer::~Timer()
{
- for(std::vector<Timer *>::iterator i = Timers.begin(); i != Timers.end(); i++)
- delete *i;
+ ServerInstance->Timers->DelTimer(this);
}
void TimerManager::TickTimers(time_t TIME)
{
- while ((Timers.size()) && (TIME > (*Timers.begin())->GetTimer()))
+ for (TimerMap::iterator i = Timers.begin(); i != Timers.end(); )
{
- std::vector<Timer *>::iterator i = Timers.begin();
- Timer *t = (*i);
+ Timer* t = i->second;
+ if (t->GetTrigger() > TIME)
+ break;
- // Probable fix: move vector manipulation to *before* we modify the vector.
- Timers.erase(i);
+ Timers.erase(i++);
- t->Tick(TIME);
- if (t->GetRepeat())
+ if (!t->Tick(TIME))
+ delete t;
+ else if (t->GetRepeat())
{
- t->SetTimer(TIME + t->GetSecs());
+ t->SetTrigger(TIME + t->GetInterval());
AddTimer(t);
}
- else
- delete t;
}
}
-void TimerManager::DelTimer(Timer* T)
+void TimerManager::DelTimer(Timer* t)
{
- std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T);
+ std::pair<TimerMap::iterator, TimerMap::iterator> itpair = Timers.equal_range(t->GetTrigger());
- if (i != Timers.end())
+ for (TimerMap::iterator i = itpair.first; i != itpair.second; ++i)
{
- delete (*i);
- Timers.erase(i);
+ if (i->second == t)
+ {
+ Timers.erase(i);
+ break;
+ }
}
}
-void TimerManager::AddTimer(Timer* T)
-{
- Timers.push_back(T);
- sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison);
-}
-
-bool TimerManager::TimerComparison( Timer *one, Timer *two)
+void TimerManager::AddTimer(Timer* t)
{
- return (one->GetTimer()) < (two->GetTimer());
+ Timers.insert(std::make_pair(t->GetTrigger(), t));
}