diff options
author | Adam <Adam@anope.org> | 2013-03-22 11:52:42 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2013-03-22 11:52:42 -0500 |
commit | f122f104c4a25ae76b92da367cc569bfc71bb16e (patch) | |
tree | 0a693782fc6348d29682bfce97b806c8db9594b5 | |
parent | deedb3bdd7afa03f5793201ceec76825930e4a79 (diff) | |
parent | d5a453b6638be81e4a69269e86bd508476305f14 (diff) |
Merge remote branch 'attila/1.9+timermanager' into 1.9
-rw-r--r-- | include/timers.h | 6 | ||||
-rw-r--r-- | src/timers.cpp | 39 |
2 files changed, 21 insertions, 24 deletions
diff --git a/include/timers.h b/include/timers.h index 49490b09d..229333596 100644 --- a/include/timers.h +++ b/include/timers.h @@ -90,7 +90,7 @@ class CoreExport TimerManager { /** A list of timers */ - static std::vector<Timer *> Timers; + static std::multimap<time_t, Timer *> Timers; public: /** Add a timer to the list * @param t A Timer derived class to add @@ -106,10 +106,6 @@ class CoreExport TimerManager * @param ctime The current time */ static void TickTimers(time_t ctime = Anope::CurTime); - - /** Compares two timers - */ - static bool TimerComparison(Timer *one, Timer *two); }; #endif // TIMERS_H diff --git a/src/timers.cpp b/src/timers.cpp index 7f4a16961..0da0d7fed 100644 --- a/src/timers.cpp +++ b/src/timers.cpp @@ -10,7 +10,7 @@ #include "services.h" #include "timers.h" -std::vector<Timer *> TimerManager::Timers; +std::multimap<time_t, Timer *> TimerManager::Timers; Timer::Timer(long time_from_now, time_t now, bool repeating) { @@ -29,7 +29,9 @@ Timer::~Timer() void Timer::SetTimer(time_t t) { + TimerManager::DelTimer(this); trigger = t; + TimerManager::AddTimer(t); } time_t Timer::GetTimer() const @@ -49,10 +51,9 @@ time_t Timer::GetSetTime() const void Timer::SetSecs(time_t t) { + TimerManager::DelTimer(this); secs = t; trigger = Anope::CurTime + t; - - TimerManager::DelTimer(this); TimerManager::AddTimer(this); } @@ -63,37 +64,37 @@ long Timer::GetSecs() const void TimerManager::AddTimer(Timer *t) { - Timers.push_back(t); - sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison); + Timers.insert(std::make_pair(t->GetTimer(), t)); } void TimerManager::DelTimer(Timer *t) { - std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), t); - - if (i != Timers.end()) - Timers.erase(i); + std::pair<std::multimap<time_t, Timer *>::iterator, std::multimap<time_t, Timer *>::iterator> itpair = Timers.equal_range(t->GetTimer()); + for (std::multimap<time_t, Timer *>::iterator i = itpair.first; i != itpair.second; ++i) + { + if (i->second == t) + { + Timers.erase(i); + break; + } + } } void TimerManager::TickTimers(time_t ctime) { - while (Timers.size() && ctime > Timers.front()->GetTimer()) + while (!Timers.empty()) { - Timer *t = Timers.front(); + std::multimap<time_t, Timer *>::iterator it = Timers.begin(); + Timer *t = it->second; + + if (t->GetTimer() > ctime) + break; t->Tick(ctime); if (t->GetRepeat()) - { t->SetTimer(ctime + t->GetSecs()); - sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison); - } else delete t; } } - -bool TimerManager::TimerComparison(Timer *one, Timer *two) -{ - return one->GetTimer() < two->GetTimer(); -} |