aboutsummaryrefslogtreecommitdiffstats
path: root/src/timer.cpp
diff options
context:
space:
mode:
authorGravatar Daniel De Graaf2010-04-13 18:40:33 -0500
committerGravatar Daniel De Graaf2010-08-03 17:32:42 -0400
commit05719a44d0c61691eb0350b8a817207e6ae386b8 (patch)
tree177a26a2e67d7887d9159fc1aaa38f4a292569d6 /src/timer.cpp
parentDrop ConfigReader::Enumerate (diff)
Avoid needless sort of timer list on every insert/repeat
Diffstat (limited to 'src/timer.cpp')
-rw-r--r--src/timer.cpp43
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));
}