diff options
| author | 2010-04-13 18:40:33 -0500 | |
|---|---|---|
| committer | 2010-08-03 17:32:42 -0400 | |
| commit | 05719a44d0c61691eb0350b8a817207e6ae386b8 (patch) | |
| tree | 177a26a2e67d7887d9159fc1aaa38f4a292569d6 /src/timer.cpp | |
| parent | Drop ConfigReader::Enumerate (diff) | |
Avoid needless sort of timer list on every insert/repeat
Diffstat (limited to 'src/timer.cpp')
| -rw-r--r-- | src/timer.cpp | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/src/timer.cpp b/src/timer.cpp index fc8071671..df524e795 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -11,10 +11,7 @@ * --------------------------------------------------- */ -/* $Core */ - #include "inspircd.h" -#include "timer.h" TimerManager::TimerManager() { @@ -22,21 +19,22 @@ TimerManager::TimerManager() TimerManager::~TimerManager() { - for(std::vector<Timer *>::iterator i = Timers.begin(); i != Timers.end(); i++) - delete *i; + for(std::multimap<time_t, Timer *>::iterator i = Timers.begin(); i != Timers.end(); i++) + delete i->second; } void TimerManager::TickTimers(time_t TIME) { - while ((Timers.size()) && (TIME > (*Timers.begin())->GetTimer())) + while (!Timers.empty()) { - std::vector<Timer *>::iterator i = Timers.begin(); - Timer *t = (*i); - - // Probable fix: move vector manipulation to *before* we modify the vector. + std::multimap<time_t, Timer*>::iterator i = Timers.begin(); + Timer* t = i->second; + if (t->GetTimer() > TIME) + return; Timers.erase(i); t->Tick(TIME); + if (t->GetRepeat()) { t->SetTimer(TIME + t->GetSecs()); @@ -49,22 +47,23 @@ void TimerManager::TickTimers(time_t TIME) void TimerManager::DelTimer(Timer* T) { - std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T); - - if (i != Timers.end()) + std::multimap<time_t, Timer*>::iterator i = Timers.find(T->GetTimer()); + while (1) { - delete (*i); - Timers.erase(i); + if (i == Timers.end()) + return; + if (i->second == T) + break; + if (i->second->GetTimer() != T->GetTimer()) + return; + i++; } -} -void TimerManager::AddTimer(Timer* T) -{ - Timers.push_back(T); - sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison); + Timers.erase(i); + delete T; } -bool TimerManager::TimerComparison( Timer *one, Timer *two) +void TimerManager::AddTimer(Timer* T) { - return (one->GetTimer()) < (two->GetTimer()); + Timers.insert(std::make_pair(T->GetTimer(), T)); } |
