diff options
author | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-02 22:19:19 +0000 |
---|---|---|
committer | Adam- <Adam-@5417fbe8-f217-4b02-8779-1006273d7864> | 2009-10-02 22:19:19 +0000 |
commit | dc4b9afebbea5c8ca2d5b86c84411153b1622f71 (patch) | |
tree | 92ca6661ccceea15a215e77f3879b4c036ada67c /src | |
parent | 85b409df8577e2433724a056564ab62ff72c4c89 (diff) |
Properly remove old callbacks from modules internal list of callbacks list, and cleaned up some of the timers code
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@2524 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src')
-rw-r--r-- | src/modulemanager.cpp | 6 | ||||
-rw-r--r-- | src/modules.c | 29 | ||||
-rw-r--r-- | src/timers.cpp | 25 |
3 files changed, 38 insertions, 22 deletions
diff --git a/src/modulemanager.cpp b/src/modulemanager.cpp index efbb6db83..e0fada619 100644 --- a/src/modulemanager.cpp +++ b/src/modulemanager.cpp @@ -479,14 +479,10 @@ bool ModuleManager::SetPriority(Module* mod, Implementation i, Priority s, Modul void ModuleManager::ClearTimers(Module *m) { std::list<Timer *>::iterator it; - Timer *t2; for (it = m->CallBacks.begin(); it != m->CallBacks.end(); ++it) { - t2 = *it; - - TimerManager::DelTimer(t2); + TimerManager::DelTimer(*it); } - m->CallBacks.clear(); } diff --git a/src/modules.c b/src/modules.c index e33bc863a..b7af6acf5 100644 --- a/src/modules.c +++ b/src/modules.c @@ -625,6 +625,19 @@ int destroyMessage(Message * m) */ void Module::AddCallBack(Timer *t) { + /* Remove no longer valid Timers from the modules internal list */ + std::list<Timer *>::iterator it, it2; + for (it = this->CallBacks.begin(); it != this->CallBacks.end(); it = it2) + { + it2 = it; + ++it2; + + if (!TimerManager::IsTimer(*it)) + { + this->CallBacks.erase(it); + } + } + this->CallBacks.push_back(t); } @@ -634,19 +647,13 @@ void Module::AddCallBack(Timer *t) */ bool Module::DelCallBack(Timer *t) { - std::list<Timer *>::iterator it; - Timer *t2; + std::list<Timer *>::iterator it = std::find(this->CallBacks.begin(), this->CallBacks.end(), t); - for (it = this->CallBacks.begin(); it != this->CallBacks.end(); ++it) + if (it != this->CallBacks.end()) { - t2 = *it; - - if (t == t2) - { - TimerManager::DelTimer(t2); - this->CallBacks.erase(it); - return true; - } + TimerManager::DelTimer(*it); + this->CallBacks.erase(it); + return true; } return false; diff --git a/src/timers.cpp b/src/timers.cpp index 02e5a3f08..d7c56072b 100644 --- a/src/timers.cpp +++ b/src/timers.cpp @@ -99,8 +99,24 @@ void TimerManager::DelTimer(Timer *T) } } +/** Check if something is a timer + * @param T A pointer + * @return true or false + */ +bool TimerManager::IsTimer(Timer *T) +{ + std::vector<Timer *>::iterator i = std::find(Timers.begin(), Timers.end(), T); + + if (i != Timers.end()) + { + return true; + } + + return false; +} + /** Tick all pending timers - * @param time The current time + * @param ctime The current time */ void TimerManager::TickTimers(time_t ctime) { @@ -110,20 +126,17 @@ void TimerManager::TickTimers(time_t ctime) 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); + sort(Timers.begin(), Timers.end(), TimerManager::TimerComparison); } else - delete t; + TimerManager::DelTimer(t); } } |